我已经使用Ruby大约两个星期了,而且我的编程时间太长了,但是我从C风格的背景(C ++,C#等)开始学习语言。无论如何 - 我的一个好朋友和导师正在看着我前几天写过的一些Ruby,他告诉我,如果他再次使用Ruby中的花括号,他会打我。
好吧,我昨天通过this About.com article发现了关于Builder的内容,他们发布的示例使用花括号。有没有不同的方法来做到这一点,或者你是否必须使用Builder的大括号?
这似乎是一个小问题,但我是Ruby的新手,我不想让自己养成任何坏习惯。你们觉得怎么样?
答案 0 :(得分:11)
虽然有些人选择“支持单行,支持多行”,我个人认为以下规则最合乎逻辑:
do-end
(通常使用each
及相关方法)和map
,inject
等)这种逻辑很适合Matt写的方法链问题。
这种方法的一个好处是,它会让你在每次编写一个块时考虑副作用,并且它们非常重要,尽管有时没有函数编程背景的编码器会忽略它。
另一种表达方式,不涉及副作用术语:
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有多种处理方式 - 你可以使用任何一种方式(在合理范围内)。