質問
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)
そして、proc insiide fooを次のように実行できます:
a.call(5)
解決
実際のプロシージャをfooに渡したい場合は、 def foo(a)
で定義してください。 a
の前に&
を置くことは、"これは実際には引数ではないことを意味します。代わりに、このメソッドに渡された block を取り出し、そこからprocを作成し、そのprocを変数a"に保存します。つまり、現在の定義を使用すると、fooを次のように呼び出すことができます。
foo do |x|
puts x*2
end
procをブロックに変換するメソッドを呼び出すときに&
を使用することもできます:
foo(&s)
所属していません StackOverflow