使用Proc.call与Proc。[]是否存在Ruby优先级问题?

时间:2010-02-23 12:46:58

标签: ruby operator-precedence proc-object

最近我和朋友讨论了Ruby的Proc。您可以通过多种方式之一拨打Proc。一种方法是调用Proc.call

p = Proc.new { |x| "hello, #{x}" }
p.call "Bob"
=> "hello, Bob"

另一种方法是使用大括号Proc.[]

p ["Bob"]
=> "hello, Bob"

这里是否存在任何潜在的优先问题,或者这两个陈述是否完全可以互换?如果没有,你能提供一个可以提供不同结果的背景的例子吗?

1 个答案:

答案 0 :(得分:2)

#call技术允许运算符优先级可能隐藏意图:

p = Proc::new do |a1| Proc::new do |a2| "#{a1.inspect}:#{a2.inspect}" end end
p.call([1,2,3]).call [1]
=> => "[1, 2, 3]:[1]"
p.call [1,2,3][1]
=> #<Proc:0x7ffa08dc@(irb):1>
p.call([1,2,3])[1]
=> "[1, 2, 3]:1"
p[[1,2,3]][[1]]
=> "[1, 2, 3]:[1]"

[]语法使得方法的参数的语法关联更加健壮,但是通过在Proc#call的参数周围添加括号来实现相同的效果。