У Ruby є два загальні стилі вибору do endпроти { }блоків:
Перший і дуже поширений стиль був популяризований Ruby on Rails і базується на простому правилі синглу проти багатолінійності:
- Використовуйте дужки
{ }для однорядкових блоків
- Використовувати
do endдля багаторядкових блоків
Це має сенс, оскільки do / end читає погано в однорядковому блоці, але для багаторядкових блоків залишення закриття }висить у власній лінії не відповідає всім іншим, що використовується endв рубіні, таких як визначення модулів, класів та методів ( defтощо) .) і керуючі структури ( if, while, caseі т.д.)
Другий, менш часто зустрічається стиль, відомий як семантичний, або " брекети Вейріха ", запропонований покійним, великим рубіністом Джимом Вейріхом:
- Використовувати
do endдля процедурних блоків
- Використовуйте дужки
{ }для функціональних блоків
Це означає, що коли блок оцінюється на його повернене значення , він повинен бути дозволений, а {}дужки мають більше сенсу для ланцюжка методів.
З іншого боку, коли блок оцінюється за його побічними ефектами , тоді повернене значення не має жодного наслідку, а блок просто щось "робить", тому не має сенсу бути ланцюжком.
Ця відмінність у синтаксисі передає візуальне значення щодо оцінки блоку та того, чи варто вам піклуватися про його повернене значення.
Наприклад, тут повернене значення блоку застосовується до кожного елемента:
items.map { |i| i.upcase }
Однак тут не використовується повернене значення блоку. Він працює процедурно і виконує з ним побічний ефект:
items.each do |item|
puts item
end
Ще одна перевага семантичного стилю полягає в тому, що вам не потрібно змінювати дужки, щоб зробити / закінчити лише тому, що до блоку була додана лінія.
Як спостереження, випадково функціональні блоки часто є однолінійними, а процедурні блоки (наприклад, конфігурація) є багаторядковими. Отже, слідування стилю Вейріха в кінцевому підсумку виглядає майже так само, як і стиль Rails.