ปัญหาของคุณง่ายมาก:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
namesรหัสนี้ครั้งแรกประกาศตัวแปรทั่วโลกที่เรียกว่า จากนั้นคุณเริ่มการวนซ้ำ for loop ประกาศตัวแปรท้องถิ่นที่เพิ่งถูกเรียกnamesด้วย ความจริงที่ว่าตัวแปรเคยถูกกำหนดไว้ก่อนหน้านี้namesไม่เกี่ยวข้องทั้งหมด การใช้งานnamesภายใน for loop ใด ๆจะอ้างอิงถึงlocal one ไม่ใช่ global
สำหรับวงบอกว่าส่วนด้านในของวงจะถูกเรียกว่ามีnames = 1แล้วและในที่สุดก็names = 2 names = 3for loop ประกาศตัวนับที่นับจากตัวเลขแรกถึงตัวสุดท้ายและจะเรียกรหัสภายในหนึ่งครั้งสำหรับแต่ละค่าที่นับ
สิ่งที่คุณต้องการจริงๆมีดังนี้:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
ไวยากรณ์ [] คือวิธีที่คุณเข้าถึงสมาชิกของตาราง Lua ตาราง Lua จับคู่ "คีย์" กับ "ค่า" อาร์เรย์ของคุณจะสร้างคีย์ประเภทจำนวนเต็มโดยอัตโนมัติซึ่งจะเพิ่มขึ้น ดังนั้นคีย์ที่เกี่ยวข้องกับ "Joe" ในตารางคือ 2 (ดัชนี Lua เริ่มต้นที่ 1 เสมอ)
ดังนั้นคุณต้องมีห่วงที่นับ 1 ถึง 3 ซึ่งคุณจะได้รับ คุณใช้ตัวแปร count เพื่อเข้าถึงองค์ประกอบจากตาราง
อย่างไรก็ตามสิ่งนี้มีข้อบกพร่อง จะเกิดอะไรขึ้นหากคุณลบองค์ประกอบใดองค์ประกอบหนึ่งออกจากรายการ
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
ตอนนี้เราได้รับเพราะความพยายามที่จะเข้าถึงค่าจากตารางที่ไม่อยู่ในผลการค้นหาJohn Joe nil nilเพื่อป้องกันสิ่งนี้เราต้องนับ 1 ถึงความยาวของตาราง:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
#เป็นผู้ดำเนินการยาว ทำงานบนตารางและสตริงโดยคืนค่าความยาวของอย่างใดอย่างหนึ่ง ตอนนี้ไม่ว่าจะใหญ่หรือเล็กแค่ไหนnamesก็ยังใช้ได้เสมอ
อย่างไรก็ตามมีวิธีที่สะดวกกว่าในการวนซ้ำหลายรายการ:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairsเป็นฟังก์ชันมาตรฐาน Lua ที่วนซ้ำในรายการ รูปแบบของการforวนซ้ำซึ่งเป็นตัววนซ้ำสำหรับการวนซ้ำใช้ฟังก์ชันวนซ้ำประเภทนี้ iค่าดัชนีของรายการในอาร์เรย์ nameคุ้มค่าคุ้มค่าที่ดัชนีว่า ดังนั้นโดยพื้นฐานแล้วมันจะทำงานหนักสำหรับคุณ