เหตุใดอาร์เรย์ Lua (ตาราง) จึงเริ่มต้นที่ 1 แทนที่จะเป็น 0


125

ฉันไม่เข้าใจเหตุผลเบื้องหลังการตัดสินใจในส่วนนี้ของ Lua เหตุใดการจัดทำดัชนีจึงเริ่มต้นที่ 1 ฉันได้อ่าน (เช่นเดียวกับคนอื่น ๆ ) กระดาษที่ยอดเยี่ยมนี้ สำหรับฉันดูเหมือนว่าเป็นมุมแปลก ๆ ของภาษาที่น่าเรียนรู้และเขียนโปรแกรมมาก อย่าเข้าใจว่าฉันผิด Lua ยอดเยี่ยมมาก แต่ต้องมีคำอธิบายที่ไหนสักแห่ง สิ่งที่ฉันพบส่วนใหญ่ (บนเว็บ) เป็นเพียงการบอกว่าดัชนีเริ่มต้นที่ 1 หยุดเต็ม

มันน่าสนใจมากที่จะอ่านสิ่งที่นักออกแบบพูดเกี่ยวกับเรื่องนี้

โปรดทราบว่าฉันเป็นมือใหม่ใน Lua ฉันหวังว่าฉันจะไม่พลาดสิ่งที่ชัดเจนเกี่ยวกับตาราง


23
ขอบเขตเริ่มต้นยังเป็นแบบโกลบอล คุณสมบัติที่ไม่เหมาะสมที่สุดสองประการของ Lua
ยานรามิน

37
ฉันจะไม่เรียกเริ่มต้นที่ 1 ความผิดปกติ จริงๆแล้วมันสมเหตุสมผลกว่า - โปรแกรมเมอร์เพิ่งได้รับการฝึกฝนมาเป็นอย่างดีในการคิดในแง่ของการสร้างดัชนีตาม 0 จากภาษาอื่น ๆ ที่เราไม่ชอบ เรายังได้รับการฝึกฝนให้คิด 5/2 = 2 นั่นไม่ได้ทำให้ถูกต้อง
BlueRaja - Danny Pflughoeft

54
@ คุณ BlueRaja-DannyPflughoeft: no. การจัดทำดัชนีเป็นศูนย์มีความหมายมากกว่า - มนุษย์ได้รับการฝึกฝนมาเป็นอย่างดีในการเริ่มนับ 1 ด้วยภาษาที่เริ่มต้นด้วย 0 จะสับสนในตอนแรก แต่ฉันอยากแนะนำให้คุณรู้จัก Edsger Dijkstra ที่นี่: cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
orlp

11
@nightcracker: เมื่อคุณนับแอปเปิ้ลบนโต๊ะคุณจะนับแอปเปิ้ลตัวแรกเป็น "หนึ่ง" อันที่สองเป็น "สอง" เป็นต้นไม่มีใครนับแอปเปิ้ลตัวแรกเป็น "ศูนย์" จากนั้นจึงเพิ่มแอปเปิ้ล หนึ่งอันต่อท้าย การนับจากศูนย์เป็นเรื่องง่ายอย่างไม่อาจคาดเดาได้ ใช่ฉันรู้ว่านั่นเป็นวิธีการทำงานของการจัดทำดัชนีภายใน แต่นั่นเป็นเหตุผลที่เราเรียกมันว่านามธรรม
BlueRaja - Danny Pflughoeft

9
ฉันไม่เคยเข้าใจความรักทั้งหมดที่มีต่อการสร้างดัชนีที่อิง 0 เป็นสิ่งที่ดีสำหรับการชดเชย (จำนวนรายการที่จะข้ามจากจุดเริ่มต้น?) และลำดับต่อมา (0 ≤ x <n) แต่ดูผิดสำหรับสิ่งพื้นฐาน (องค์ประกอบที่สองเรียกว่าหนึ่งหรือไม่องค์ประกอบที่สิบสอดคล้องกับดัชนีเก้า? WAT?) . แม้แต่โปรแกรมเมอร์ก็นับ 1 เมื่อพวกเขาพยายามค้นหาบรรทัดที่รายงานโดยคอมไพเลอร์ ...
marcus

คำตอบ:


143

Lua สืบเชื้อสายมาจากภาษา Sol ซึ่งเป็นภาษาที่ออกแบบมาสำหรับวิศวกรปิโตรเลียมโดยไม่มีการฝึกอบรมอย่างเป็นทางการในการเขียนโปรแกรมคอมพิวเตอร์ คนที่ไม่ได้รับการฝึกฝนในการใช้คอมพิวเตอร์คิดว่ามันเป็นเรื่องแปลกที่จะเริ่มนับที่ศูนย์ ด้วยการนำอาร์เรย์และการจัดทำดัชนีสตริงแบบ 1 ฐานมาใช้นักออกแบบ Lua จึงหลีกเลี่ยงการสร้างความสับสนให้กับความคาดหวังของลูกค้ารายแรกและผู้ให้การสนับสนุน

แม้ว่าฉันจะพบว่ามันแปลก ๆ ในตอนเริ่มต้น แต่ฉันก็เรียนรู้ที่จะรักอาร์เรย์ที่ใช้ 0 แต่ฉันทำได้โดยตกลงกับอาร์เรย์ที่ใช้ 1 ของ Lua โดยเฉพาะอย่างยิ่งเมื่อใช้forลูปทั่วไปของ Lua และตัวipairsดำเนินการ - โดยปกติแล้วฉันสามารถหลีกเลี่ยงความกังวลเกี่ยวกับการจัดทำดัชนีอาร์เรย์ได้อย่างไร


7
นี่เป็นเพียงเหตุผลทางการตลาดในอดีต ไม่มีเหตุผลที่สมเหตุสมผลโดยเฉพาะอย่างยิ่งในเวลาปัจจุบัน และดูเหมือนว่าคุณกำลังพยายามหลีกเลี่ยงการจัดทำดัชนี 1 ฐานแทนที่จะใช้มัน :)
eonil

27
@Eonil หลีกเลี่ยงการจัดทำดัชนีที่ชัดเจนช่วยลดข้อผิดพลาดในการจัดทำดัชนี
Dan D.

8
เหตุผลทางประวัติศาสตร์ของ @Eonil มักเป็นเหตุผลที่เกี่ยวข้อง คุณเริ่มต้นด้วยบางสิ่งจากนั้นคุณจะไม่สามารถเปลี่ยนแปลงได้เพราะมันจะทำลายรหัสที่มีอยู่ทั้งหมด โดยเฉพาะอย่างยิ่งไม่ดีสำหรับการจัดทำดัชนี 0 เทียบกับ 1 เนื่องจากวิธีการแตกนั้นค่อนข้างละเอียดอ่อน
CodesInChaos

5
ความแตกต่างระหว่างการเริ่มต้นจาก 1 ไปยังความยาวและจาก 0 ถึงความยาว -1 แต่ในการวนซ้ำ< lengthนั้นสะดวกกว่ามากและอ่านง่ายกว่าใน "ภาษาที่อิงจากภาษาแปลก 0" ฉันสารภาพเมื่อฉันเห็นลูปวนซ้ำจาก 1 ฉันคิดว่ามันเริ่มจากองค์ประกอบที่ 2 ทันที: S
Felype

45

ในการเขียนโปรแกรมในการอภิปรายตารางครั้งแรกของLuaพวกเขากล่าวถึง:

เนื่องจากคุณสามารถทำดัชนีตารางด้วยค่าใดก็ได้คุณจึงสามารถเริ่มดัชนีของอาร์เรย์ด้วยตัวเลขใดก็ได้ที่คุณพอใจ อย่างไรก็ตามเป็นเรื่องปกติใน Lua ที่จะเริ่มอาร์เรย์ด้วย 1 (ไม่ใช่ด้วย 0 เช่นเดียวกับใน C) และสิ่งอำนวยความสะดวกหลายอย่างยึดตามแบบแผนนี้

ต่อมาในบทที่เกี่ยวกับโครงสร้างข้อมูลพวกเขาพูดเกือบจะเหมือนกันอีกครั้งนั่นคือสิ่งอำนวยความสะดวกในตัวของ Lua ถือว่าการจัดทำดัชนีแบบ 1 ฐาน

อย่างไรก็ตามมีความสะดวกสองสามประการในการใช้การจัดทำดัชนีแบบ 1 ฐาน ได้แก่ ตัวดำเนินการ#(ความยาว): t[#t]เข้าถึงดัชนีสุดท้าย (ตัวเลข) ของตารางและt[#t+1]เข้าถึง 1 ผ่านดัชนีสุดท้าย สำหรับคนที่ยังไม่เคยสัมผัสกับการจัดทำดัชนีที่อิง 0 #t+1จะเป็นเรื่องง่ายกว่าที่จะเลื่อนผ่านจุดสิ้นสุดของรายการ นอกจากนี้ยังมีfor i = 1,#tโครงสร้างของ Lua ซึ่งฉันเชื่อว่าอยู่ในหมวดหมู่เดียวกันกับจุดก่อนหน้าที่ว่า "1 to the length" มีความสมเหตุสมผลมากกว่าการสร้างดัชนี "0 ถึงความยาวลบ 1"

แต่ถ้าคุณไม่สามารถทำลายความคิดของการจัดทำดัชนีที่อิง 0 ได้การจัดทำดัชนีที่อิง 1 ของ Lua อาจเป็นอุปสรรคมากกว่าอย่างแน่นอน ในท้ายที่สุดผู้เขียนต้องการสิ่งที่ทำงานให้กับพวกเขา ; และฉันยอมรับว่าฉันไม่รู้ว่าเป้าหมายเดิมของพวกเขาคืออะไร แต่มันอาจเปลี่ยนไปตั้งแต่นั้นมา


16

ความเข้าใจของฉันคือมันเป็นเช่นนั้นเพียงเพราะผู้เขียนคิดว่ามันจะเป็นวิธีที่ดีที่จะทำและหลังจากที่พวกเขาเผยแพร่ภาษาสู่สาธารณะแล้วการตัดสินใจก็กลายเป็นเรื่องยากมาก (ฉันสงสัยว่าจะมีนรกที่ต้องจ่ายถ้าพวกเขาเปลี่ยนมันในวันนี้!) ฉันไม่เคยเห็นเหตุผลพิเศษใด ๆ นอกเหนือจากนั้น


6
เหตุผลที่เป็นไปได้: C ทำได้เพียงเพราะโดยทั่วไปแล้วอาร์เรย์เป็นเพียงตัวชี้และarray[0] == array + 0;การนับตาม 1 นั้นเป็นธรรมชาติมากขึ้นเมื่ออาร์เรย์เป็นตารางแฮชจริงๆ
ผู้พิพากษา Maygarden

19
ดัชนี Lua เป็นดัชนีที่แท้จริง ในภาษา C เมื่อคุณพูดว่าดัชนีสิ่งที่คุณหมายถึงคือออฟเซ็ต
Alex

8

อาจเป็นจุดที่มีนัยสำคัญน้อยกว่า แต่สิ่งที่ฉันยังไม่เคยได้ยิน: มีความสมมาตรที่ดีกว่าในความจริงที่ว่าอักขระตัวแรกและตัวสุดท้ายในสตริงอยู่ที่ 1 และ -1 ตามลำดับแทนที่จะเป็น 0 และ -1


8
แม้ว่าจะเป็นเรื่องดี แต่ก็ไม่ใช่เหตุผลที่จะเริ่มในวันที่ 1
lhf

3

ห้องสมุด Lua ชอบใช้ดัชนีซึ่งเริ่มต้นที่ 1 อย่างไรก็ตามคุณสามารถใช้ดัชนีใดก็ได้ที่คุณต้องการ คุณสามารถใช้ 0 คุณสามารถใช้ 1 คุณสามารถใช้ -5 มีอยู่ในคู่มือของพวกเขาซึ่งสามารถพบได้ที่ ( https://www.lua.org/pil/11.1.html )

อันที่จริงสิ่งที่น่าสนใจที่นี่คือห้องสมุด lua ภายในจะถือว่า SOME ที่ผ่าน 0 เป็น 1 เพียงระมัดระวังเมื่อใช้ ipairs
ดังนั้น: ("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"จะเป็นจริง

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end

มีวิธีที่จะทำให้({'a', 'b'})[1]ประเมิน'b'ไม่ได้'a'หรือไม่? ดูเหมือนว่ามีอยู่แล้วภายในสำหรับฉัน
remram

1
({[0] = 'a', 'b'})[1]
user2262111

0

เหตุผลที่แท้จริงคือภาษาเป็นการนำคำจำกัดความในกฎหมายของโปรตุเกสไปใช้และศูนย์การพัฒนาที่สำคัญอยู่ในบราซิลและความต้องการของพวกเขาคือหลีกเลี่ยงการใช้ศูนย์หรือว่างเปล่าหรือไม่มีอะไรเป็นดัชนีหรือตัวห้อย อย่างไรก็ตามภาษาไม่อนุญาตให้ใช้ดัชนีเริ่มต้นอื่นที่ไม่ใช่ 1 ในฟังก์ชันการสร้างตารางในบางเวอร์ชัน


5
แม้ว่าจะเป็นเรื่องจริง แต่ก็ไม่ได้เกี่ยวข้องกับวิธีการออกแบบของ Lua เลย
lhf

-1

ตาราง [0] จะส่งคืนค่าศูนย์ (null) เสมอไม่ว่าคุณจะกำหนดค่าให้ตัวเองตาราง [0] = 'ค่าบางค่า' จากนั้นตาราง [0] จะส่งคืน 'ค่าบางส่วน' ที่คุณกำหนด

นี่คือตัวอย่าง:

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))

-11

มันสมเหตุสมผลสำหรับทุกคนว่าถ้าก

table = {}

ในขณะนี้ tableนี้ว่างเปล่า ดังนั้นเมื่อ

table == {something}

ตารางมีบางอย่างดังนั้นสิ่งที่มีอยู่คือดัชนี 1 ในtableถ้าคุณรู้ว่าฉันหมายถึงอะไร

สิ่งที่ฉันหมายถึงตารางนั้น [0] มีอยู่และตาราง = {} ซึ่งว่างเปล่าตอนนี้โปรแกรมเมอร์จะไม่เรียกตารางว่างมันตั้งค่าแล้วเติมมันจะไม่มีประโยชน์ที่จะหาที่ว่างเปล่า ตารางทุกครั้งที่คุณต้องการเรียกมันดังนั้นจึงง่ายกว่าในการสร้างตารางเปล่า

ภาษาอังกฤษของฉันจะไม่ดีขึ้นและนั่นคือไวยากรณ์ที่ดีที่สุดของฉัน ถ้าคุณไม่ชอบมันคุณมีอิสระที่จะไม่อ่านมันต่อไป แต่การให้ -rep สำหรับคนที่พยายามช่วยทำให้คนไม่อยากช่วยเลยโดยเฉพาะบางอย่างเช่นไวยากรณ์ ฉันเป็นคนคิดเลขไม่ใช่ไวยากรณ์ ขอโทษ


4
ฉันไม่เข้าใจแนวคิดของตารางที่มีมูลค่า 0 ตารางสามารถมีความยาวได้ 0 แต่นั่นไม่ขึ้นกับตัวเลือกของดัชนีแรก ฉันไม่สนใจเกี่ยวกับข้อผิดพลาดทางไวยากรณ์เล็กน้อย แต่ฉันไม่เข้าใจประเด็นของคำตอบของคุณซึ่งเป็นสาเหตุที่ทำให้ฉันลดคะแนนลง
CodesInChaos

นั่นคือสิ่งที่ฉันพูดถึงตารางไม่สามารถถือด้วยดัชนี 0 หรือค่าได้เนื่องจากเราใช้มันเป็นตารางว่าง <, <เมื่อคุณมีบางสิ่งบางอย่างสิ่งนี้เป็นตัวแทนจาก 1, "n" ดังนั้นเมื่อคุณไม่มีอะไรคุณจะว่างเปล่า ของบางสิ่งบางอย่างซึ่งจะนำเราไปสู่ซีโร่ แต่จำนวนเซโรโดสต์มันเป็นความยาวที่ใช้งานได้จริงคุณอย่าออกไปข้างนอกและบอกเพื่อนของคุณว่าคุณรู้ว่าฉันมี 0 เพลงของศิลปินนั้นหรือคุณมีอะไรบ้าง Dont จุดตาราง = {} นั่นคือ cero โต๊ะว่าง
Wesker

5
อาร์เรย์ที่ใช้ดัชนี0เป็นองค์ประกอบเท่านั้นยังคงไม่ว่างเปล่า ในความเป็นจริง lua สนับสนุนสิ่งนี้ไม่ใช่แค่หลักการเริ่มต้นเท่านั้น
CodesInChaos

ใช่ฉันเห็นด้วยกับคุณเกี่ยวกับคำศัพท์อื่น ๆ แต่ไม่ใช่ lua มีดัชนี lua 0 ไม่อยู่ดังนั้นเราจึงสามารถจินตนาการได้ว่ามันเป็นค่าว่าง = 0 หรือว่าฉันนึกภาพอย่างไรแม้ว่าคุณจะบังคับให้ดัชนีเป็น 0 ได้ มันจะไม่ทำงานกับค่าตาราง #table จะไม่อ่านดัชนี 0 ดังนั้นคำตอบของฉันมันยังคงทำพื้นฐานเหมือนเหตุการณ์ปกติตอนนี้ถ้าพวกเขาตั้งใจหรือไม่มันไม่เกี่ยวข้องจริงๆคุณจะไม่เขียนโค้ดรูอีกครั้งและ เราไม่สามารถทำอะไรกับมันได้: / ฉันยังคงเชื่อว่ามันยุติธรรมที่จะบอกว่าใน lua โต๊ะว่างมีดัชนี 0
Wesker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.