สำหรับ Loop on Lua


87

งานของฉันคือวิธีทำห่วง ฉันคิดออกในรูปของตัวเลข แต่ไม่สามารถคิดออกเป็นชื่อได้ ฉันต้องการสร้าง for loop ที่เรียกใช้รายชื่อ ต่อไปนี้คือสิ่งที่ฉันมีจนถึงตอนนี้:

names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end

ฉันลองทำอย่างอื่นแล้ว แต่ก็ไม่ได้ผลเทอร์มินัลมักจะแสดงรายการ 1, 2, 3 เสมอ ...

คำตอบ:


204

ปัญหาของคุณง่ายมาก:

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


1
ดังนั้นสำหรับ ipairs () ทำงานเป็น foreach () ในภาษาอื่น ๆ
boctulus

15
คำตอบที่ดีฉันจะเพิ่มว่าในตัวอย่างสุดท้ายเป็นเรื่องปกติที่จะใช้_เมื่อไม่ได้ใช้ var เช่นnames = {'John', 'Joe', 'Steve'} for _, name in ipairs(names) do print (name) end
เฟรเซอร์

19

โดยการอ่านออนไลน์ (การสอนตาราง ) ดูเหมือนว่าตารางจะทำงานเหมือนอาร์เรย์ดังนั้นคุณกำลังมองหา:

ทาง 1

names = {'John', 'Joe', 'Steve'}
for i = 1,3 do print( names[i] ) end

ทาง 2

names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end

Way1ใช้ตารางindex/keyบนตารางของคุณnamesแต่ละองค์ประกอบมีคีย์เริ่มต้นจาก 1 ตัวอย่างเช่น:

names = {'John', 'Joe', 'Steve'}
print( names[1] ) -- prints John

คุณก็แค่ทำ iจาก 1 เป็น 3

บนWay2แทนคุณระบุตารางที่คุณต้องการรันและกำหนดตัวแปรสำหรับคีย์และค่าเช่น:

names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end

พิมพ์สิ่งต่อไปนี้:

1   John
2   Joe
myKey   myValue

6
คุณอ่านบทแนะนำตาราง แต่คุณไม่เห็นipairs? หรือส่วนที่pairsไม่ต้องคืนค่าคีย์ตามลำดับใด ๆ ?
Nicol Bolas

ipairsตอนแรกฉันใช้จริงแต่เมื่อฉันเพิ่มmyKey="myValue"ตัวอย่างที่จำเป็นpairsสำหรับคีย์ที่ไม่ใช่ตัวเลขฉันก็ตัดสินใจเปลี่ยนส่วนที่เหลือด้วยpairsเช่นกัน ฉันขอโทษถ้าฉันข้ามไปว่าไม่รับประกันคำสั่งซื้อที่มีคู่ แต่ฉันทิ้งลิงค์ไว้ตรงนั้นให้เขาอ่าน
derp

1
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
  print (names)
end
  1. คุณกำลังลบตารางของคุณและแทนที่ด้วย int
  2. คุณไม่ได้ดึงค่าจากตาราง

ลอง:

names = {'John','Joe','Steve'}
for i = 1,3 do
    print(names[i])
end

1
Downvoter: โปรดระบุเหตุผลที่ถูกต้องในการลงคะแนน แม้ว่าฉันคิดว่าคำตอบนั้นทำให้เข้าใจผิดในสิ่งนั้นnames(ตัวนับจำนวนเต็ม) ตามที่ประกาศในforขอบเขตจะแนะนำตัวแปรท้องถิ่นซึ่งเงาnames(อาร์เรย์ตาราง) ตามที่ประกาศในขอบเขตส่วนกลาง
Dejavu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.