3

最近、友人と Ruby の について話し合っていましたProc。いくつかの方法のいずれかでa を呼び出すことができProcます。1 つの方法は、次のように呼び出すことProc.callです。

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

もう 1 つは中括弧を使用することですProc.[]

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

ここに潜在的な優先順位の問題がありますか、またはこれら 2 つのステートメントは完全に交換可能ですか? そうでない場合、異なる結果が得られるコンテキストの例を提供できますか?

4

1 に答える 1

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

于 2010-02-23T13:17:45.243 に答える