最近我和朋友讨论了Ruby的Proc
。您可以通过多种方式之一拨打Proc
。一种方法是调用Proc.call
:
p = Proc.new { |x| "hello, #{x}" }
p.call "Bob"
=> "hello, Bob"
另一种方法是使用大括号Proc.[]
:
p ["Bob"]
=> "hello, Bob"
这里是否存在任何潜在的优先问题,或者这两个陈述是否完全可以互换?如果没有,你能提供一个可以提供不同结果的背景的例子吗?
答案 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
的参数周围添加括号来实现相同的效果。