Ruby中这些块编码风格有什么区别或价值?

哪种风格是首选? 一个人和另一个人有很好的理由吗?

提前致谢!

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}" } 

铁杆队和许多其他ruby主义者喜欢使用一个线块花括号,并do...end多行的do...end

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

根据“镐”书 (我在这里看第二版),戈登是正确的:唯一的区别是优先:

第356页(我的斜体):

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

另请参阅第168页的示例。

这两种forms是等价的。

build议的样式是对一个线块使用大括号,对于多线块使用“do” – “end”。

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

下面的例子是由Austin提出的:

 def foo yield end puts foo { "hello" } puts foo do "hello" end 

第一个“puts”打印出“hello”:foo被调用返回放置参数的“hello”。

第二次保释失败:

 in `foo': no block given 

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

再次感谢奥斯汀清理这个。

戈登的回答是“ruby之路”,尽pipe将一条线放在花括号里是一种常见的做法,但并不是必须的。

还要注意一个人可以轻松地处理结果值:

 cmds.each do |cmd| cmd.upcase! end.sort # Now, cmds = ["CREATE", "HELP", "LIST", "UPDATE"] 

虽然您可能已经看到{}在这里更具可读性,因此如果其他人要看到您的代码,

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

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

do…end语法与其他Ruby控制结构(if,def,class)非常相似,所以使用block来保持代码的外观一致和清晰。 但是对单线运动员来说效果并不理想,这就是为什么在那里首选方括号的原因。

通常,使用{}保留给单行块,而do...end是多行块。

由于在Ruby中不像在C ++或Javascript等其他语言中那样频繁使用{}所以在给定机会而不是{}时使用do...end可以使您的代码更易于其他Ruby专家读取。

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

我不认为这真的很重要 – 这只是一个审美的个人select。 有些人更喜欢在块需要多行的时候使用do...end版本,当所有块在一行时使用{...}版本。