Ruby中这些块编码样式的区别或价值是什么?

时间:2009-02-10 16:21:08

标签: ruby coding-style

首选哪种款式? 一个与另一个有充分的理由吗?

提前致谢!

1) cmds.each do |cmd|
   end

2) cmds.each { |cmd|
   }

示例代码:

cmds = [ "create", "update", "list", "help" ]

# Block style one
#
cmds.each do |cmd|
  puts "loop1, cmd: #{cmd}"
end

# Block style two
#
cmds.each { |cmd|
  puts "loop2, cmd: #{cmd}"
}

7 个答案:

答案 0 :(得分:37)

rails团队和许多其他rubyists prefer使用花括号表示一行块,do...end表示多行表。

两者之间唯一的功能差异是do...end块的优先级低于{...}块的优先级。

答案 1 :(得分:21)

根据the "Pickaxe" book(我在这里看第2版),戈登是正确的:唯一的区别是优先权:

p.356(我的斜体):

  

大括号具有高优先级; do   优先级低。如果方法   调用具有非参数   括在括号中的大括号   块的形式将绑定到最后一个   参数,而不是整体   调用do表单将绑定   调用

有关示例,请参见第168页。

答案 2 :(得分:13)

这两种形式是等效的。

推荐的样式是使用一个行块的大括号,并对多行块使用“do” - “end”。

编辑: Austin Ziegler指出(在下面的评论中)这两种形式具有不同的优先级:大括号具有更高的优先级。因此,当调用没有括号的方法时,{}中包含的块将绑定到最后一个参数而不是调用方法。

以下示例由Austin建议:

def foo
    yield
end

puts foo { "hello" }

puts foo do
    "hello"
end

第一个“puts”打印“hello”:foo被称为返回“hello”,这是puts的参数。

第二次失误并出现错误:

in `foo': no block given

因为在这种情况下,do-end块绑定到puts方法。

再次感谢Austin清理它。

答案 3 :(得分:10)

戈登的答案是“红宝石之路”,尽管将一行放入大括号是一种常见的做法,但并不是必需的。

另请注意,人们可以轻松地对结果值采取行动:

cmds.each do |cmd| cmd.upcase! end.sort

# Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"]

虽然您可能已经看到{}在这里更具可读性,因此如果有其他人愿意看到您的代码,则首选:

cmds.each { |cmd| cmd.upcase! }.sort

答案 4 :(得分:2)

大多数情况下,样式1用于多行块,样式2用于单行。

do…end语法非常类似于其他Ruby控件结构(if,def,class),因此使用块来保持代码的外观一致且清晰。但它对于单行不适用,这就是为什么括号版本在那里的首选。

答案 5 :(得分:1)

传统上,使用{}保留用于单行块,而do...end用于多行块。

由于Ruby中{}的使用频率与其他语言(如C ++或Javascript)不同,因此在给定do...end的情况下使用{}可以帮助您更好地使用代码其他Rubyists可读。

请注意,{}优先于do...end

答案 6 :(得分:0)

我认为这不重要 - 这只是一种审美的个人选择。有些人喜欢在块需要多行时使用do...end版本,而在{one}}版本全部在一行时使用{...}版本。