ฉันต้องการสร้างจุดเฉพาะเกี่ยวกับ for in loop ใน Ruby มันอาจดูเหมือนโครงสร้างคล้ายกับภาษาอื่น ๆ แต่ในความเป็นจริงมันเป็นนิพจน์เหมือนกับโครงสร้างวนลูปอื่น ๆ ทั้งหมดใน Ruby อันที่จริง, for in ทำงานกับอ็อบเจกต์ Enumerable เช่นเดียวกับ iterator แต่ละอัน
คอลเลกชันที่ส่งผ่านไปสำหรับในสามารถเป็นวัตถุใด ๆ ที่มีวิธีการวนซ้ำแต่ละ อาร์เรย์และแฮชจะกำหนดแต่ละวิธีและวัตถุอื่น ๆ ของทับทิมก็ทำเช่นกัน for / in loop เรียกใช้แต่ละเมธอดของวัตถุที่ระบุ เนื่องจากตัววนซ้ำนั้นให้ค่าสำหรับการวนรอบจะกำหนดค่าแต่ละค่า (หรือแต่ละชุดของค่า) ให้กับตัวแปรที่ระบุ (หรือตัวแปร) จากนั้นเรียกใช้รหัสในเนื้อความ
นี่เป็นตัวอย่างที่งี่เง่า แต่แสดงให้เห็นถึงจุดที่ว่า for in loop ทำงานกับวัตถุใด ๆ ที่มีแต่ละวิธีเช่นเดียวกับที่ตัววนซ้ำแต่ละตัวทำ:
class Apple
TYPES = %w(red green yellow)
def each
yield TYPES.pop until TYPES.empty?
end
end
a = Apple.new
for i in a do
puts i
end
yellow
green
red
=> nil
และตอนนี้ตัววนซ้ำแต่ละตัว:
a = Apple.new
a.each do |i|
puts i
end
yellow
green
red
=> nil
อย่างที่คุณเห็นทั้งสองตอบสนองต่อแต่ละวิธีที่ให้ค่ากลับไปที่บล็อก ดังที่ทุกคนกล่าวไว้ที่นี่มันดีกว่าที่จะใช้ตัววนซ้ำแบบวนซ้ำในการวนซ้ำ ฉันแค่อยากจะขับรถกลับบ้านในจุดที่ไม่มีอะไรวิเศษเกี่ยวกับในวง มันเป็นนิพจน์ที่เรียกใช้แต่ละวิธีของคอลเลกชันแล้วส่งผ่านไปยังบล็อกของโค้ด ดังนั้นจึงเป็นกรณีที่หายากมากที่คุณจะต้องใช้สำหรับในใช้ตัววนซ้ำแต่ละตัวเกือบตลอดเวลา (พร้อมด้วยประโยชน์เพิ่มเติมของขอบเขตบล็อก)