質問

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top