В чем разница или значение этих стилей блочного кодирования в Ruby?
Какой стиль предпочтительнее?
Есть ли веская причина для одного против другого?
Спасибо заранее!
1) cmds.each do |cmd|
end
2) cmds.each { |cmd|
}
Пример кода:
cmds = [ "create", "update", "list", "help" ]
# Block style one
#
cmds.each do |cmd|
puts "loop1, cmd: #{cmd}"
end
# Block style two
#
cmds.each { |cmd|
puts "loop2, cmd: #{cmd}"
}
Ответы
Ответ 1
Команда rails и многие другие рубисты предпочитают использовать фигурные скобки для одного строкового блока и do...end
для многострочных.
Единственное функциональное различие между ними состоит в том, что приоритет блока do...end
ниже, чем у блока {...}
.
Ответ 2
Согласно книге "Пикакс" (я смотрю на 2-е издание здесь), Гордон исправляет: единственное отличие - приоритет:
p.356 (курсив мой):
Скобки имеют высокий приоритет; do
имеет низкий приоритет. Если метод вызов имеет параметры, которые не являются заключенные в круглые скобки, скобка форма блока связывается с последним параметр, а не общий призывание. Форма do
свяжется к вызову.
См. также пример .168.
Ответ 3
Две формы эквивалентны.
Рекомендуемый стиль - использовать фигурные скобки для одного строкового блока и использовать "do" - "end" для многострочных блоков.
Изменить: Остин Зиглер указал (в комментарии ниже), что эти две формы имеют разностные уровни приоритета: фигурные скобки имеют более высокий приоритет, Поэтому при вызове метода без скобок блок, заключенный в {}, будет привязан к последнему аргументу вместо метода вызова.
Следующий пример был предложен Остином:
def foo
yield
end
puts foo { "hello" }
puts foo do
"hello"
end
Первый "puts" выводит "hello": foo получает вызванное возвращение "hello", которое является аргументом puts.
Второе поручение с ошибкой:
in `foo': no block given
Так как в этом случае блок do-end привязывается к методу puts.
Еще раз спасибо Остину за это.
Ответ 4
Ответ Гордона - это "Рубиновый путь", и хотя обычная практика заключается в том, чтобы поставить одну линию в фигурные скобки, она не требуется.
Также обратите внимание на легкость, с которой можно воздействовать на результирующее значение:
cmds.each do |cmd| cmd.upcase! end.sort
# Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"]
Хотя вы уже можете видеть, как {}
более читабельна здесь, и поэтому предпочитает, если кто-то еще увидит ваш код:
cmds.each { |cmd| cmd.upcase! }.sort
Ответ 5
Чаще всего стиль 1 используется для многострочных блоков, а стиль 2 используется для однострочных.
Синтаксис do…end
очень похож на другие структуры управления Ruby (if, def, class), поэтому использование этого для блоков сохраняет внешний вид вашего кода согласованным и понятным. Но он не подходит для однострочных линий, поэтому предпочтительнее использовать скобки.
Ответ 6
Обычно использование {}
зарезервировано для однострочных блоков, а do...end
- для многострочных блоков.
Из-за того, что {}
не используются в Ruby так же часто, как на других языках, таких как С++ или Javascript, использование do...end
при предоставлении возможности вместо {}
может помочь сделать ваш код более читаемым для других рубистов.
Обратите внимание, что {}
имеет приоритет над do...end
.
Ответ 7
Я не думаю, что это действительно важно - это просто эстетический личный выбор. Некоторые люди предпочитают использовать версию do...end
, когда блоку требуется несколько строк и версия {...}
, когда все это в одной строке.