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来避免这种混乱。
TA贡献1884条经验 获得超4个赞
来自编程Ruby:
大括号具有很高的优先级; 确实有一个低优先级。如果方法调用具有未括在括号中的参数,则块的大括号形式将绑定到最后一个参数,而不是整个调用。do表单将绑定到调用。
所以代码
f param {do_something()}
param在代码中将块绑定到变量
f param do do_something() end
将块绑定到函数f。
但是,如果将函数参数括在括号中,则这不是问题。
TA贡献1744条经验 获得超4个赞
我投票支持do / end
该惯例适用do .. end于多线和{ ... }单线。
但是我喜欢do .. end更好,所以当我有一个衬垫时,do .. end无论如何都会使用它,但是像往常一样将它格式化为三行中的do / end。这让每个人都开心。
10.times do
puts ...
end
一个问题{ }是它是诗歌模式 - 敌对(因为它们紧紧地绑定到最后一个参数,而不是整个方法调用,所以你必须包括方法parens),在我看来,它们看起来并不那么好看。它们不是语句组,它们与哈希常量冲突以便于阅读。
另外,我已经{ }在C程序中看到了足够的内容。像往常一样,Ruby的方式更好。只有一种类型的if块,您永远不必返回并将语句转换为复合语句。
- 3 回答
- 0 关注
- 709 浏览
添加回答
举报