Подтвердить что ты не робот

В чем разница или значение этих стилей блочного кодирования в 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}"
}
4b9b3361

Ответ 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, когда блоку требуется несколько строк и версия {...}, когда все это в одной строке.