ปัญหาของคุณง่ายมาก:
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 = 3
for 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
คุ้มค่าคุ้มค่าที่ดัชนีว่า ดังนั้นโดยพื้นฐานแล้วมันจะทำงานหนักสำหรับคุณ