В 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.