У меня есть коллега, который активно пытается убедить меня, что я не должен использовать do..end и вместо этого использовать фигурные скобки для определения многострочных блоков в Ruby.
Я твердо нахожусь в лагере использования только фигурных скобок для коротких однострочников и делаю .. конец всему остальному. Но я думал, что смогу обратиться к большему сообществу, чтобы получить какое-то решение.
Так что это и почему? (Пример некоторого кода musta)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
или
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
Лично, просто взглянув на вышеизложенное, я отвечу на этот вопрос, но я хотел открыть его для более широкого сообщества.
ruby-on-rails
ruby
ruby-on-rails-3
coding-style
Блейк Тейлор
источник
источник
Ответы:
Общее соглашение состоит в том, чтобы использовать do..end для многострочных блоков и фигурные скобки для однострочных блоков, но есть также разница между ними, которая может быть проиллюстрирована в этом примере:
Это означает, что {} имеет более высокий приоритет, чем do..end, поэтому имейте это в виду, когда решаете, что вы хотите использовать.
PS: еще один пример, о котором нужно помнить, пока вы разрабатываете свои предпочтения.
Следующий код:
действительно означает:
И этот код:
действительно означает:
Таким образом, чтобы получить точное определение, которое вы хотите, с помощью фигурных скобок, вы должны сделать:
Может быть, вы все равно хотите использовать фигурные скобки для параметров, но если нет, то, вероятно, лучше использовать do..end в этих случаях, чтобы избежать этой путаницы.
источник
puts [1,2,3].map do |k| k+1; end
перечислитель перечисляет только одно. Не путы прошли два аргумента здесь именно[1,2,3].map
иdo |k| k+1; end
?Из программирования Ruby :
Итак, код
Привязывает блок к
param
переменной, пока кодПривязывает блок к функции
f
.Однако это не проблема, если вы заключаете аргументы функций в круглые скобки.
источник
Есть несколько точек зрения на это, это действительно вопрос личных предпочтений. Многие рубинисты используют подход, который вы делаете. Однако два других распространенных стиля - всегда использовать один или другой, или использовать
{}
для блоков, которые возвращают значения, иdo ... end
для блоков, которые выполняются для побочных эффектов.источник
У фигурных скобок есть одно главное преимущество: многие редакторы гораздо быстрее сопоставляют их, что значительно облегчает отладку некоторых типов. Между тем, ключевое слово "do ... end" найти довольно сложно, тем более что "end" также соответствует "if" s.
источник
do ... end
ключевые слова по умолчаниюdo ... end
как это особый случай, который требует специфической для языка логики.Наиболее распространенное правило, которое я видел (совсем недавно в Eloquent Ruby ):
источник
Я голосую за до / конец
Соглашение
do .. end
для многострочных и{ ... }
однострочников.Но мне нравится
do .. end
больше, поэтому, когда у меня есть один вкладыш, яdo .. end
все равно использую, но форматирую его как обычно для do / end в три строки. Это делает всех счастливыми.Одна из проблем
{ }
заключается в том, что он враждебен поэтическому режиму (потому что они тесно связаны с последним параметром, а не со всем вызовом метода, поэтому вы должны включить парены методов), и они просто, на мой взгляд, выглядят не так хорошо. Они не являются группами операторов и конфликтуют с хеш-константами для удобства чтения.Плюс, я видел достаточно программ
{ }
на Си. Путь Руби, как обычно, лучше. Существует ровно один типif
блока, и вам никогда не придется возвращаться и преобразовывать оператор в составной оператор.источник
do_stuff if x==1
), который немного раздражает при преобразовании в обычный синтаксис. Но это другое обсуждение.if
, постфиксif
, постфиксunless
(также видif
, если-нет) и одна строкаif
сthen
. Способ Ruby состоит в том, чтобы иметь множество способов выразить то, что на самом деле всегда одно и то же, гораздо хуже, чем то, что предлагает C, и следует очень простым и строгим правилам.Пара влиятельных рубиистов предлагает использовать фигурные скобки, когда вы используете возвращаемое значение, и делать / заканчивать, когда вы этого не делаете.
http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace (на archive.org)
http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc (на archive.org)
Это кажется хорошей практикой в целом.
Я бы немного изменил этот принцип, чтобы сказать, что вам следует избегать использования do / end в одной строке, потому что его сложнее читать.
Вы должны быть более осторожными, используя фигурные скобки, потому что они будут привязаны к последнему параметру метода вместо всего вызова метода. Просто добавьте скобки, чтобы избежать этого.
источник
На самом деле это личное предпочтение, но, сказав, что за последние 3 года моего опыта с ruby я узнал, что у ruby есть свой стиль.
Одним из примеров может быть, если вы используете фон JAVA, для логического метода, который вы можете использовать
обратите внимание на случай верблюда и чаще всего префикс «is», чтобы определить его как логический метод.
Но в мире рубинов тот же метод будет
так что я лично думаю, что лучше пойти по «рубиновому пути» (но я знаю, что это займет некоторое время, чтобы понять (мне потребовалось около 1 года: D)).
Наконец, я бы пошел с
блоки.
источник
Я поставил другой ответ, хотя большая разница уже была указана (prcedence / binding), и это может привести к трудностям при поиске проблем (Жестянщик и другие указали на это). Я думаю, что мой пример показывает проблему с не очень обычным фрагментом кода, даже опытные программисты не читают как воскресные времена:
Затем я сделал некоторый код, украшающий ...
если вы измените
{}
здесь,do/end
вы получите ошибку, этот методtranslate
не существует ...Почему это происходит, указывается здесь более чем один - приоритет. Но где поставить скобки здесь? (@ Оловянный человечек: я всегда использую брекеты, как и вы, но здесь ... под присмотром)
так что каждый ответ нравится
просто неправильно, если используется без «НО Следите за фигурными скобками / приоритетом!»
очередной раз:
и
(что когда-либо делает результат с блоком ...)
Так что если вы хотите использовать do / end, используйте это:
источник
Что касается личной предвзятости, я предпочитаю фигурные скобки, а не блоки do / end, поскольку это более понятно большему количеству разработчиков, поскольку большинство фоновых языков используют их в соответствии с соглашением do / end. С учетом вышесказанного реальный ключ заключается в том, чтобы прийти к соглашению в вашем магазине, если разработчики do / end используют 6/10 разработчиков, то ВСЕ должны их использовать, если 6/10 используют фигурные скобки, то придерживайтесь этой парадигмы.
Все дело в создании шаблона, чтобы команда в целом могла быстрее идентифицировать структуры кода.
источник
Между ними есть небольшая разница, но {} связывается сильнее, чем do / end.
источник
Мой личный стиль состоит в том, чтобы подчеркнуть удобочитаемость, а не жесткие правила
{
...}
противdo
...end
выбора, когда такой выбор возможен. Моя идея читабельности заключается в следующем:В более сложном синтаксисе, таком как многострочные вложенные блоки, я пытаюсь разбить
{
...}
иdo
...end
разделители для наиболее естественного результата, например.Несмотря на то, что отсутствие жестких правил может привести к разным вариантам выбора для разных программистов, я считаю, что оптимизация для удобства чтения в каждом конкретном случае, хотя и субъективна, является чистым преимуществом по сравнению с соблюдением жестких правил.
источник
Ruby
что это лучший прагматичный язык. Должен ли я сказать скриптовый язык. Сегодня я думаю, что вы были бы в равной степени хорошо учитьсяBrainfuck
.Я взял пример наиболее проголосовавшего ответа здесь. Сказать,
Если вы проверите, какая внутренняя реализация в array.rb, заголовок метода map говорит :
Invokes the given block once for each element of self.
то есть он принимает блок кода - все, что находится между do и end , выполняется как yield. Затем результат будет снова собран как массив, таким образом, он возвращает совершенно новый объект.
источник
Есть и третий вариант: написать препроцессор, который выведет «конец» в отдельной строке, начиная с отступа. Глубокие мыслители, которые предпочитают сжатый код, оказываются правы.
Еще лучше взломать рубин, так что это флаг.
Конечно, самое простое решение «выбери бой» - это принять соглашение о стиле, согласно которому последовательность концов появляется на одной строке, и научить цветовую подсветку синтаксиса отключать их. Для удобства редактирования можно использовать сценарии редактора, чтобы развернуть / свернуть эти последовательности.
От 20% до 25% моих строк кода ruby являются «концом» своей собственной строки, все тривиально выведено из моих соглашений об отступах. Ruby - подобный языку язык, который достиг наибольшего успеха. Когда люди оспаривают это, спрашивая, где все ужасные скобки, я показываю им функцию ruby, заканчивающуюся семью строками лишнего «конца».
Я годами писал код, используя препроцессор lisp для вывода большинства скобок: строка '|' открыл группу, которая автоматически закрывалась в конце строки, а знак доллара «$» служил пустым заполнителем, где в противном случае не было бы символов, помогающих вывести группы. Это конечно территория религиозной войны. Лисп / схема без скобок является самым поэтичным из всех языков. Тем не менее, проще просто смягчить скобки, используя синтаксическую раскраску.
Я все еще пишу с препроцессором для Haskell, чтобы добавить heredocs и по умолчанию все строки сброса в качестве комментариев, все отступы в виде кода. Мне не нравятся комментарии персонажей, независимо от языка.
источник