为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

波斯汪 2019-08-23 09:22:49

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

}


查看完整描述

3 回答

?
茅侃侃

rails团队和许多其他rubyists 更喜欢将花括号用于一个行块和do...end多行块。

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


查看完整回答
反对 回复 2019-08-23
?
手掌心

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

p.356(我的斜体):

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

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


查看完整回答
反对 回复 2019-08-23
?
月关宝盒

这两种形式是等价的。

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

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

以下示例由Austin建议:

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

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

第二个保释错误:

in `foo': no block given

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

再次感谢Austin清理这个问题。


查看完整回答
反对 回复 2019-08-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信