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

eck*_*kza 7 ruby forms builder curly-braces

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

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

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

Mla*_*vić 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


Mat*_*ggs 10

惯用的红宝石是

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

# do/end for multi-line
method_name do |param|
  param.do_something
end
Run Code Online (Sandbox Code Playgroud)

这样做的一个原因是链接,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
Run Code Online (Sandbox Code Playgroud)

调用一个方法只有一些奇怪的东西end,即使语法上两者是等价的.