В чем разница или значение этих стилей блочного кодирования в Ruby? - PullRequest
31 голосов
/ 10 февраля 2009

Какой стиль предпочтительнее? Есть ли веская причина для одного против другого?

Заранее спасибо!

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}"
}

Ответы [ 7 ]

37 голосов
/ 10 февраля 2009

Команда rails и многие другие rubyists предпочитают использовать фигурные скобки для блоков из одной строки и do...end для многострочных.

Единственное функциональное различие между ними состоит в том, что приоритет блока do...end ниже, чем у блока {...}.

21 голосов
/ 10 февраля 2009

Согласно книге "Кирка" (я смотрю на 2-е издание здесь), Гордон прав: единственное отличие - это приоритет:

с.356 (курсив мой):

Брекеты имеют высокий приоритет; do имеет низкий приоритет Если метод вызов имеет параметры, которые не являются в скобках заключена скобка форма блока будет привязана к последнему параметр, а не в целом призывание . Форма do будет связывать на вызов .

См. Также стр.168 для примера.

13 голосов
/ 10 февраля 2009

Две формы эквивалентны.

Рекомендуемый стиль - использовать фигурные скобки для блоков одной строки и использовать «do» - «end» для многострочных блоков.

Редактировать: Остин Циглер указал (в комментарии ниже), что две формы имеют разные уровни приоритета: фигурные скобки имеют более высокий приоритет. Поэтому при вызове метода без скобок блок, заключенный в {}, будет привязан к последнему аргументу вместо вызывающего метода.

Остин предложил следующий пример:

def foo
    yield
end

puts foo { "hello" }

puts foo do
    "hello"
end

Первый метод "put" выводит "hello": foo вызывается, возвращая "hello", который является аргументом для put.

Второй залог с ошибкой:

in `foo': no block given

Поскольку в этом случае блок do-end связывается с методом put.

Еще раз спасибо Остину за разъяснения.

11 голосов
/ 10 февраля 2009

Ответ Гордона - «Рубиновый путь», и хотя принято ставить одну скобку в скобки, это не обязательно.

Также обратите внимание на легкость, с которой можно воздействовать на полученное значение:

cmds.each do |cmd| cmd.upcase! end.sort

# Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"]

Хотя вы, возможно, уже видели, как {} более читабелен здесь, и поэтому предпочтительнее, если кто-то еще увидит ваш код:

cmds.each { |cmd| cmd.upcase! }.sort
2 голосов
/ 10 февраля 2009

Чаще всего стиль 1 используется для многострочных блоков, а стиль 2 - для однострочников.

Синтаксис do…end очень похож на другие управляющие структуры Ruby (if, def, class), поэтому его использование для блоков сохраняет целостность и ясность внешнего вида вашего кода. Но он не работает хорошо для однострочников, поэтому версия с скобками здесь предпочтительнее.

1 голос
/ 24 июля 2015

Обычно использование {} зарезервировано для однострочных блоков, а do...end - для многострочных блоков.

Из-за того, что {} не используются в Ruby так часто, как в других языках, таких как C ++ или Javascript, использование do...end при наличии возможности вместо {} может сделать ваш код более читабельным для других Rubyists.

Обратите внимание, что {} имеет приоритет над do...end.

0 голосов
/ 10 февраля 2009

Я не думаю, что это действительно имеет значение - это просто эстетический личный выбор. Некоторые люди предпочитают использовать версию do...end, когда блоку требуется несколько строк, и версию {...}, когда все в одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...