使用花括号是否违背“Ruby方式”?

时间:2011-03-02 16:20:39

标签: ruby forms builder curly-braces

我已经使用Ruby大约两个星期了,而且我的编程时间太长了,但是我从C风格的背景(C ++,C#等)开始学习语言。无论如何 - 我的一个好朋友和导师正在看着我前几天写过的一些Ruby,他告诉我,如果他再次使用Ruby中的花括号,他会打我。

好吧,我昨天通过this About.com article发现了关于Builder的内容,他们发布的示例使用花括号。有没有不同的方法来做到这一点,或者你是否必须使用Builder的大括号?

这似乎是一个小问题,但我是Ruby的新手,我不想让自己养成任何坏习惯。你们觉得怎么样?

4 个答案:

答案 0 :(得分:11)

虽然有些人选择“支持单行,支持多行”,我个人认为以下规则最合乎逻辑:

  • 当您的区块有副作用时使用do-end(通常使用each及相关方法)和
  • 当您的区块没有副作用时使用大括号(mapinject等)

这种逻辑很适合Matt写的方法链问题。

这种方法的一个好处是,它会让你在每次编写一个块时考虑副作用,并且它们非常重要,尽管有时没有函数编程背景的编码器会忽略它。

另一种表达方式,不涉及副作用术语:

  • 对{strong>执行
  • 的块使用do-end
  • 使用{}来阻止返回

以下是几篇有更多信息的文章:

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

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

答案 1 :(得分:10)

惯用红宝石

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调用一个方法有一些奇怪的地方,尽管从语法上来说这两个方法是等价的。

答案 2 :(得分:4)

通常的约定是单行的{ ... }块和多行的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 而不是

答案 3 :(得分:-2)

“Ruby方式”并不提倡任何特定的风格。如果他们不希望您选择使用花括号,则不会使用该语言。也就是说,符合您团队的编码风格(如果您与团队合作)。

我见过的大多数Ruby代码使用end代替花括号,但我不使用Ruby,所以我不能肯定这是首选样式。 Ruby有多种处理方式 - 你可以使用任何一种方式(在合理范围内)。