บล็อก (Block) คือกลุ่มโค้ดที่ถูกส่งเข้าไปยังเมธอด ปิดล้อมด้วย { } (บรรทัดเดียว) หรือ do...end (หลายบรรทัด) บล็อกเป็นคุณสมบัติที่เป็นเอกลักษณ์และเป็นแกนกลางของ Ruby มันคือวิธีที่คุณส่งพฤติกรรมไปยังเมธอด ขับเคลื่อนการวนซ้ำ callback และสไตล์ที่สง่างามและสื่อความหมายได้ดีของ Ruby
ไวยากรณ์ของบล็อก
# { } for single-line blocks
[1, 2, 3].each { |n| puts n }
# do...end for multi-line blocks
[1, 2, 3].each do |n|
doubled = n * 2
puts doubled
end
บล็อกถูกส่งไปยังเมธอด (ในที่นี้คือ each) ซึ่งเรียกบล็อกสำหรับแต่ละ element ส่วน |n| ประกาศพารามิเตอร์ของบล็อก (ค่าที่ถูกส่งเข้ามา) ทั้งสองไวยากรณ์เทียบเท่ากัน ตามข้อตกลงจะใช้ { } สำหรับบล็อกสั้น ๆ และ do...end สำหรับบล็อกที่ยาวกว่า
บล็อกขับเคลื่อนการวนซ้ำและการแปลงรูป
[1, 2, 3, 4].map { |n| n * 2 } # [2, 4, 6, 8] — transform each
[1, 2, 3, 4].select { |n| n.even? } # [2, 4] — filter
[1, 2, 3, 4].reduce(0) { |sum, n| sum + n } # 10 — accumulate
3.times { |i| puts i } # 0, 1, 2
[1, 2, 3].each_with_index { |val, i| ... }
บล็อกคือวิธีที่ Ruby ทำการวนซ้ำและแปลงรูปข้อมูล คุณส่ง "สิ่งที่ต้องทำ" เป็นบล็อก และเมธอดจัดการการวนซ้ำให้ ซึ่งสง่างามกว่าการใช้ลูปแบบชัดเจน
บล็อกสำหรับการจัดการทรัพยากร
# blocks elegantly handle setup/teardown — the file is auto-closed after the block
File.open("data.txt") do |file|
puts file.read
end # file automatically closed here, even if an error occurs
เมธอดสามารถใช้บล็อกสำหรับรูปแบบ setup/cleanup (เช่นการรับประกันว่าไฟล์ถูกปิด) เมธอดจัดการทรัพยากรและเรียกบล็อกของคุณในระหว่างนั้น
ทางลัด &:method
[1, 2, 3].map { |n| n.to_s } # full block
[1, 2, 3].map(&:to_s) # shorthand — &:method calls that method on each element
["a", "b"].map(&:upcase) # ["A", "B"]
ทางลัด &:method เป็นสำนวนที่กระชับสำหรับบล็อกที่เพียงแค่เรียกเมธอดหนึ่งบนแต่ละ element
ทำไมจึงสำคัญ
บล็อกเป็นหนึ่งในคุณสมบัติที่เป็นเอกลักษณ์และเป็นแกนกลางที่สุดของ Ruby มันเป็นพื้นฐานของการทำงานของ Ruby และสไตล์ที่สง่างามและสื่อความหมายได้ดีของมัน ดังนั้นการเข้าใจมันจึงจำเป็นต่อการพัฒนา Ruby ใด ๆ
บล็อกคือวิธีที่คุณ ส่งพฤติกรรมไปยังเมธอด ซึ่งขับเคลื่อนแนวทางอันเป็นเอกลักษณ์ของ Ruby ในการ วนซ้ำและแปลงรูปข้อมูล: แทนที่จะเขียนลูปแบบชัดเจน คุณส่งบล็อกที่อธิบายว่าจะทำอะไรกับแต่ละ element (map, select, reduce, each) และเมธอดจัดการการวนซ้ำให้ ส่งผลให้ได้โค้ดที่กระชับ อ่านง่าย และเป็นสไตล์ฟังก์ชันที่เป็นเอกลักษณ์ของ Ruby
บล็อกยังช่วยให้เกิดรูปแบบ การจัดการทรัพยากร อันสง่างาม (เมธอดจัดการ setup/teardown เช่นการปิดไฟล์อัตโนมัติ โดยเรียกบล็อกของคุณในระหว่างนั้น)
การเข้าใจไวยากรณ์ของบล็อก ({ } กับ do...end) วิธีที่บล็อกรับพารามิเตอร์ (|n|) วิธีที่บล็อกขับเคลื่อนเมธอด Enumerable ที่ปรากฏตลอดเวลาใน Ruby และสำนวนอย่าง ทางลัด &:method เป็นความรู้พื้นฐานที่ต้องรู้ บล็อกปรากฏในแทบทุกบรรทัดของ Ruby ที่เป็นธรรมชาติ (ทุกการวนซ้ำ การแปลงรูป และการเรียกเมธอดหลายครั้ง)
เนื่องจากบล็อกเป็นแกนกลางของการออกแบบและสไตล์ที่สื่อความหมายได้ดีของ Ruby ซึ่งช่วยให้เกิดการวนซ้ำอันสง่างาม callback และรูปแบบการจัดการทรัพยากร การเชี่ยวชาญมันจึงเป็นสิ่งจำเป็นอย่างยิ่งต่อการอ่านและเขียน Ruby และเป็นคุณสมบัติที่นิยามตัวตนซึ่งทำให้แนวทางของ Ruby แตกต่างจากภาษาที่พึ่งพาลูปแบบชัดเจน ทำให้เป็นหัวข้อที่พบบ่อยและสำคัญต่อการเข้าใจภาษานี้
