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

对于Ruby中的块,执行。对比花括号

对于Ruby中的块,执行。对比花括号

慕妹3242003 2019-09-19 15:12:07
我有一个同事正在积极地试图说服我不要使用do..end而是使用花括号来定义Ruby中的多行块。我坚定地只使用花括号作为短单线,并且做其他事情。但我想我会联系更大的社区来获得一些解决方案。那是哪个,为什么?(一些应该代码的示例)context do  setup { do_some_setup() }  should "do somthing" do    # some more code...  endend要么context {  setup { do_some_setup() }  should("do somthing") {    # some more code...  }}就个人而言,只看上面的问题就可以解答我的问题,但我想向更大的社区开放。
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

一般约定是将do..end用于单行块和大括号的花括号,但是这两个例子之间也有区别,可以用这个例子说明:


puts [1,2,3].map{ |k| k+1 }

2

3

4

=> nil

puts [1,2,3].map do |k| k+1; end

#<Enumerator:0x0000010a06d140>

=> nil

这意味着{}具有比do..end更高的优先级,因此在决定要使用的内容时请记住这一点。


PS:在开发偏好时要记住的另一个例子。


以下代码:


task :rake => pre_rake_task do

  something

end

真正意思:


task(:rake => pre_rake_task){ something }

这段代码:


task :rake => pre_rake_task {

  something

}

真正意思:


task :rake => (pre_rake_task { something })

因此,要获得您想要的实际定义,使用花括号,您必须执行以下操作:


task(:rake => pre_rake_task) {

  something

}

也许使用大括号作为参数是你想要做的事情,但如果你不这样做,最好在这些情况下使用do..end来避免这种混乱。


查看完整回答
反对 回复 2019-09-19
?
慕村9548890

TA贡献1884条经验 获得超4个赞

来自编程Ruby:


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


所以代码


f param {do_something()}

param在代码中将块绑定到变量


f param do do_something() end

将块绑定到函数f。


但是,如果将函数参数括在括号中,则这不是问题。


查看完整回答
反对 回复 2019-09-19
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

我投票支持do / end

该惯例适用do .. end于多线和{ ... }单线。


但是我喜欢do .. end更好,所以当我有一个衬垫时,do .. end无论如何都会使用它,但是像往常一样将它格式化为三行中的do / end。这让每个人都开心。


  10.times do 

    puts ...

  end

一个问题{ }是它是诗歌模式 - 敌对(因为它们紧紧地绑定到最后一个参数,而不是整个方法调用,所以你必须包括方法parens),在我看来,它们看起来并不那么好看。它们不是语句组,它们与哈希常量冲突以便于阅读。


另外,我已经{ }在C程序中看到了足够的内容。像往常一样,Ruby的方式更好。只有一种类型的if块,您永远不必返回并将语句转换为复合语句。


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 663 浏览

添加回答

举报

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