0
s = Proc.new {|x|x*2}
puts s.call(5)
-> 10

def foo(&a)
 a.call(5)
end

puts "test foo:"
foo(s)

上記のprocを呼び出そうとすると、次のようになります。

foo: wrong number of arguments (1 for 0) (ArgumentError)

私の期待は、メソッドがこのタイプのシグニチャーで定義されている場合、procをメソッドに渡すことができるということでした。

def foo(&a)

次に、次のようにprocinsiidefooを実行できます。

 a.call(5)
4

1 に答える 1

7

実際のprocをfooに渡したい場合は、。で定義するだけdef foo(a)です。&の前に置くことは、 a「これは実際には引数ではありません。代わりに、このメソッドに渡されたブロックを取得し、そこからprocを作成し、そのprocを変数aに格納する」ことを意味します。言い換えれば、現在の定義では、次のようにfooを呼び出すことができます。

foo do |x|
  puts x*2
end

&メソッドを呼び出してprocをブロックに変換するときにも使用できます。

foo(&s)
于 2009-09-16T18:23:57.270 に答える