Có hai kiểu phổ biến để chọn do end
so { }
với các khối trong Ruby:
Kiểu đầu tiên và rất phổ biến đã được phổ biến bởi Ruby on Rails, và dựa trên một quy tắc đơn giản của một dòng so với nhiều dòng:
- Sử dụng dấu ngoặc nhọn
{ }
cho các khối một dòng
- Sử dụng
do end
cho các khối nhiều dòng
Điều này có ý nghĩa bởi vì do / end đọc không tốt trong một lớp lót, nhưng đối với các khối nhiều dòng, việc để một đóng cửa }
treo trên dòng riêng của nó không nhất quán với mọi thứ khác sử dụng end
trong ruby, chẳng hạn như định nghĩa mô-đun, lớp và phương thức ( def
v.v. cấu trúc điều khiển.) và ( if
, while
, case
, vv)
Thứ hai, phong cách ít thường xuyên nhìn thấy được gọi là ngữ nghĩa, hoặc " Weirich niềng răng ", bởi muộn, rubyist lớn Jim Weirich đề xuất:
- Sử dụng
do end
cho các khối thủ tục
- Sử dụng dấu ngoặc nhọn
{ }
cho các khối chức năng
Điều này có nghĩa là khi khối được đánh giá cho giá trị trả về của nó , nó sẽ có thể phân phối được và các {}
dấu ngoặc nhọn có ý nghĩa hơn đối với chuỗi phương thức.
Mặt khác, khi khối được đánh giá về các tác dụng phụ của nó , thì giá trị trả về không có hậu quả gì, và khối chỉ đang "làm" điều gì đó, vì vậy nó không có ý nghĩa gì khi bị xâu chuỗi.
Sự khác biệt này trong cú pháp truyền đạt ý nghĩa trực quan về việc đánh giá khối và liệu bạn có nên quan tâm đến giá trị trả về của nó hay không.
Ví dụ: ở đây giá trị trả về của khối được áp dụng cho mọi mục:
items.map { |i| i.upcase }
Tuy nhiên, ở đây nó không sử dụng giá trị trả về của khối. Nó hoạt động procedurally, và làm một tác dụng phụ với nó:
items.each do |item|
puts item
end
Một lợi ích khác của kiểu ngữ nghĩa là bạn không cần thay đổi dấu ngoặc nhọn để thực hiện / kết thúc chỉ vì một dòng đã được thêm vào khối.
Theo quan sát, các khối chức năng trùng hợp thường là một lớp lót và các khối thủ tục (ví dụ: cấu hình) là nhiều dòng. Vì vậy, làm theo kiểu Weirich cuối cùng trông gần giống với kiểu Rails.