Существует два общих стиля для выбора do end
против { }
для блоков в Ruby:
Первый и очень распространенный стиль был популяризирован 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.