В Ruby есть два общих стиля для выбора do endи { }для блоков:
Первый и очень распространенный стиль был популяризирован Ruby on Rails и основан на простом правиле однострочного и многострочного:
- Используйте фигурные скобки
{ }для однострочных блоков
- Используйте
do endдля многострочных блоков
Это имеет смысл, потому что do / end плохо читается в однострочном блоке, но для многострочных блоков оставление закрытия }на отдельной строке несовместимо со всем остальным, что используется endв ruby, например определениями модулей, классов и методов (и defт. .) и управляющие структуры ( if, while,case и т.д.)
Второй, менее часто встречающийся стиль известен как семантический, или « скобки Вейриха », предложенный покойным великим рубистом Джимом Вейрихом:
- Использование
do endдля процедурных блоков
- Используйте скобы
{ }для функциональных блоков
Это означает, что, когда блок оценивается на предмет его возвращаемого значения , он должен быть цепочкой, а {}фигурные скобки имеют больше смысла для цепочки методов.
С другой стороны, когда блок оценивается на предмет его побочных эффектов , то возвращаемое значение не имеет значения, и блок просто «делает» что-то, поэтому нет смысла связывать его в цепочку.
Это различие в синтаксисе передает визуальное значение оценки блока и того, следует ли вам заботиться о его возвращаемом значении.
Например, здесь возвращаемое значение блока применяется к каждому элементу:
items.map { |i| i.upcase }
Однако здесь не используется возвращаемое значение блока. Это процедурно работает, и делает побочный эффект с ним:
items.each do |item|
puts item
end
Еще одно преимущество семантического стиля заключается в том, что вам не нужно менять фигурные скобки для завершения / завершения только потому, что в блок была добавлена строка.
Как наблюдение, совпадающие функциональные блоки часто являются однострочными, а процедурные блоки (например, config) - многострочными. Итак, следование стилю Weirich в конечном итоге выглядит почти так же, как и стиль Rails.