ฉันกำลังอ่านเอกสารและฉันส่ายหัวอย่างต่อเนื่องในการตัดสินใจออกแบบภาษา แต่สิ่งที่ทำให้ฉันงงจริงๆคือวิธีจัดการกับอาร์เรย์
ฉันรีบไปที่สนามเด็กเล่นและลองสิ่งเหล่านี้ คุณสามารถลองได้เช่นกัน ดังนั้นตัวอย่างแรก:
var a = [1, 2, 3]
var b = a
a[1] = 42
a
b
ที่นี่a
และb
เป็นทั้งคู่[1, 42, 3]
ซึ่งฉันสามารถยอมรับได้ มีการอ้างอิงอาร์เรย์ - ตกลง!
ตอนนี้ดูตัวอย่างนี้:
var c = [1, 2, 3]
var d = c
c.append(42)
c
d
c
เป็น[1, 2, 3, 42]
แต่เป็นd
[1, 2, 3]
นั่นคือd
เห็นการเปลี่ยนแปลงในตัวอย่างสุดท้าย แต่ไม่เห็นในตัวอย่างนี้ เอกสารบอกว่าเป็นเพราะความยาวเปลี่ยนไป
ทีนี้ลองดูอันนี้:
var e = [1, 2, 3]
var f = e
e[0..2] = [4, 5]
e
f
e
คืออะไร[4, 5, 3]
ซึ่งเท่ห์ มันดีที่มีการแทนที่หลายดัชนี แต่f
STILL ไม่เห็นการเปลี่ยนแปลงแม้ว่าความยาวจะไม่เปลี่ยนแปลง
ดังนั้นเมื่อต้องการสรุปการอ้างอิงทั่วไปของอาเรย์จะเห็นการเปลี่ยนแปลงหากคุณเปลี่ยน 1 อิลิเมนต์ แต่ถ้าคุณเปลี่ยนอิลิเมนต์หรือไอเท็มต่อท้ายจะมีการคัดลอก
ดูเหมือนว่าการออกแบบที่แย่มากสำหรับฉัน ฉันคิดถูกไหม มีเหตุผลที่ฉันไม่เห็นหรือไม่ว่าทำไมอาร์เรย์จึงควรทำแบบนี้?
แก้ไข : อาร์เรย์มีการเปลี่ยนแปลงและตอนนี้มีความหมายของค่า มีสติมากขึ้น!
std::shared_ptr
ไม่มีรุ่นที่ไม่ใช่อะตอมมีคำตอบตามความเป็นจริงไม่ใช่ความเห็น (ความจริงก็คือคณะกรรมการพิจารณาแล้ว แต่ไม่ต้องการเหตุผลหลายประการ)