当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Ruby中这些块编码样式的区别或价值是什么?》经验,为你挑选了4个好方法。

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

提前致谢!

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

Gordon Wilso.. 38

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

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



1> Gordon Wilso..:

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

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



2> Mike Woodhou..:

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

p.356(我的斜体):

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

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



3> nimrodm..:

这两种形式是等价的.

建议的样式是使用一个行块的大括号,并对多行块使用"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清理这个问题.


不,他们不是.def foo yield end puts foo {"hello"} puts foo do; "你好"; 结束后者将抛出异常.前者不会(并且会打印"你好").{}绑定到#foo; do/end绑定到#puts.

4> nerdz..:

Gordon的回答是"Ruby Way",尽管将一行放入大括号是一种常见做法,但并不是必需的.

还要注意一个人可以轻松地对结果值采取行动:

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

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

虽然您可能已经看到{}这里的可读性如何,因此如果有其他人想要查看您的代码,则首选:

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有