Новичок в Ruby, наденьте перчатки для новичков.
Есть ли разница (неясная или практическая) между следующими двумя фрагментами?
my_array = [:uno, :dos, :tres]
my_array.each { |item|
puts item
}
my_array = [:uno, :dos, :tres]
my_array.each do |item|
puts item
end
Я понимаю, что синтаксис скобок позволит вам разместить блок в одной строке
my_array.each { |item| puts item }
но есть ли какие-либо веские причины использовать один синтаксис вместо другого?
ruby
coding-style
Алан Сторм
источник
источник
each
do
end
Ruby , переданный блок кода работает со скобками, но не с - (ruby) , Определение блока - разница между фигурными скобками иdo
-end
? , Многострочный блок Ruby безdo
end
, В чем разница или значение этих стилей кодирования блоков в Ruby? и блок Ruby и аргументы без скобок .Ответы:
В кулинарной книге Ruby говорится, что синтаксис скобок имеет более высокий приоритет, чем
do..end
Второй пример работает только при использовании скобок,
1.upto(3) { |x| puts x }
источник
Это немного старый вопрос, но я хотел бы попытаться объяснить немного больше
{}
иdo .. end
как было сказано ранее
но как это имеет значение:
в этом случае
do..end
метод method1 будет вызван с блоком, а метод method2 будет передан методу1 в качестве аргумента! что эквивалентноmethod1(method2){ puts "hi" }
но если вы скажете
тогда метод2 будет вызван с блоком, затем возвращенное значение будет передано методу1 в качестве аргумента. Что эквивалентно
method1(method2 do puts "hi" end)
#### вывод ####
источник
Обычно это соглашение используется,
{}
когда вы выполняете небольшую операцию, например, вызов метода, сравнение и т. Д., Так что это имеет смысл:Но если у вас немного сложная логика, которая состоит из нескольких строк, используйте
do .. end
примерно так:По сути, это сводится к тому, что если логика вашего блока состоит из нескольких строк и не может быть размещена в одной строке, тогда используйте,
do .. end
а если ваша логика блока проста и всего лишь простая / одна строка кода, тогда используйте{}
.источник
result_with_some_condition = method{|c| c.do_something || whateever}; result_with_some_condition.another_method
это просто делает его немного более понятным. Но в целом я бы избегал крушения поезда.В Ruby есть два общих стиля для выбора
do end
и{ }
для блоков:Первый и очень распространенный стиль был популяризирован Ruby on Rails и основан на простом правиле однострочного и многострочного:
{ }
для однострочных блоковdo end
для многострочных блоковЭто имеет смысл, потому что do / end плохо читается в однострочном блоке, но для многострочных блоков оставление закрытия
}
на отдельной строке несовместимо со всем остальным, что используетсяend
в ruby, например определениями модулей, классов и методов (иdef
т. .) и управляющие структуры (if
,while
,case
и т.д.)Второй, менее часто встречающийся стиль известен как семантический, или « скобки Вейриха », предложенный покойным великим рубистом Джимом Вейрихом:
do end
для процедурных блоков{ }
для функциональных блоковЭто означает, что, когда блок оценивается на предмет его возвращаемого значения , он должен быть цепочкой, а
{}
фигурные скобки имеют больше смысла для цепочки методов.С другой стороны, когда блок оценивается на предмет его побочных эффектов , то возвращаемое значение не имеет значения, и блок просто «делает» что-то, поэтому нет смысла связывать его в цепочку.
Это различие в синтаксисе передает визуальное значение оценки блока и того, следует ли вам заботиться о его возвращаемом значении.
Например, здесь возвращаемое значение блока применяется к каждому элементу:
Однако здесь не используется возвращаемое значение блока. Это процедурно работает, и делает побочный эффект с ним:
Еще одно преимущество семантического стиля заключается в том, что вам не нужно менять фигурные скобки для завершения / завершения только потому, что в блок была добавлена строка.
Как наблюдение, совпадающие функциональные блоки часто являются однострочными, а процедурные блоки (например, config) - многострочными. Итак, следование стилю Weirich в конечном итоге выглядит почти так же, как и стиль Rails.
источник
Я использовал стиль Вейриха в течение многих лет, но просто отошел от него, чтобы всегда использовать подтяжки . Я не помню, чтобы когда-либо использовал информацию из стиля блока, и определение довольно расплывчатое. Например:
Они прокурорские или функциональные?
А подсчет строк, на мой взгляд, просто бесполезен. Я знаю, есть ли одна или несколько строк, и почему я должен менять стиль только потому, что я добавил или удалил строки?
источник