Использование фигурных скобок идет против "Рубинового пути"? - PullRequest
7 голосов
/ 02 марта 2011

Я использую Ruby около двух недель, и я не слишком долго программировал, но я прихожу к языку из C-стиля (C ++, C # и т. Д.). В любом случае - мой хороший друг и наставник смотрел на какого-нибудь Руби, который я написал на днях, и он сказал мне, что ударит меня, если снова поймает меня, используя фигурные скобки в Руби.

Ну, я только что узнал о Builder вчера через эту статью о About.com , и пример, который они опубликовали, использует фигурные скобки. Есть ли другой способ сделать это, или вам нужно использовать фигурные скобки с Builder?

Это может показаться незначительным, но я новичок в Ruby и не хочу позволять себе развивать какие-либо вредные привычки. Что вы, ребята, думаете?

Ответы [ 4 ]

11 голосов
/ 02 марта 2011

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

  • используйте do-end, когда у вашего блока есть побочные эффекты (обычно с each и связанными с ним методами) и
  • используйте фигурные скобки, когда у вашего блока нет побочных эффектов (map, inject и т. П.)

Эта логика хорошо сочетается с проблемой цепочки методов, о которой писал Мэтт.

Одним из преимуществ этого подхода является то, что он заставляет вас думать о побочных эффектах каждый раз, когда вы пишете блок, и они очень важны, хотя иногда упускаются из виду программистами, не имеющими опыта программирования.

Другой способ выразить это без терминологии побочных эффектов:

  • использовать do-end для блоков, которые выполняют
  • используйте { и } для блоков, которые возвращают

Вот пара статей с дополнительной информацией:

http://onestepback.org/index.cgi/Tech/Ruby/BraceVsDoEnd.rdoc

http://talklikeaduck.denhaven2.com/2007/10/02/ruby-blocks-do-or-brace

10 голосов
/ 02 марта 2011

Идиоматический рубин

method_name {|param| param.do_something} # squigglies for one liners

# do/end for multi-line
method_name do |param|
  param.do_something
end

Одной из причин этого является цепочка, foo.map {|f| f.num}.reduce(0) {|memo, i| memo + i} выглядит лучше, чем зависание вызова метода от end, как

foo.map do |f| 
  f.num
end.reduce(0) do |memo, i| 
  memo + i
end

Есть просто что-то странное в вызове метода из end, хотя синтаксически оба они эквивалентны.

4 голосов
/ 02 марта 2011

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

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

def f x
  yield x
end

f 123 do |n| p n end  # works
f 123  { |n| p n }    # does not work
f(123) { |n| p n }    # works, of course

Конечно, если вы хотели присоединить блок к параметру в режиме поэзии, то вы выиграли с {}, за которым следует do end.

def g  ; p ['g', yield] end
def f x; p ['f', yield] end

f g { 2 } do 3 end
["g", 2]
["f", 3]

Наконец, и вопреки некоторым советам, которые вы получили здесь, ; - это , а не , необходимое до end.

0 голосов
/ 02 марта 2011

«Рубиновый путь» не поддерживает какой-либо конкретный стиль.Если бы они не хотели, чтобы у вас была возможность использовать фигурные скобки, это было бы не на языке.Тем не менее, следуйте стилю кодирования вашей команды (если вы работаете с командой).

Большинство кодов Ruby, которые я видел, используют end вместо фигурных скобок, но я не использую Rubyпоэтому я не могу точно сказать, что это предпочтительный стиль.В Ruby есть несколько способов работы - вы можете использовать любой способ, который вам нравится (в пределах разумного).

...