7

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

好吧,我昨天刚刚通过这篇 About.com 文章了解了 Builder ,他们发布的示例使用了花括号。有没有不同的方法可以做到这一点,或者你必须在 Builder 中使用花括号?

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

4

4 回答 4

11

虽然有些人选择“单线大括号,多线大括号”,但我个人认为以下规则最合乎逻辑:

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

这个逻辑与马特写的方法链问题很相配。

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

在不涉及副作用术语的情况下,另一种说法是:

  • 用于执行do-end的块
  • 使用{and}用于返回的块

以下是一些包含更多信息的文章:

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

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

于 2011-03-02T17:03:13.890 回答
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尽管从语法上讲这两者是等价的,但调用一个方法还是有些奇怪的。

于 2011-03-02T16:25:05.617 回答
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]

最后,与您在此处收到的一些建议相反,之前;不需要aend

于 2011-03-02T18:10:01.983 回答
-2

“Ruby 方式”不提倡任何特定的风格。如果他们不希望您可以选择使用花括号,那么它就不会出现在语言中。也就是说,符合您团队的编码风格(如果您正在与团队合作)。

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

于 2011-03-02T16:25:55.797 回答