Pergunta

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

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

puts "test foo:"
foo(s)

Quando tento chamar a proc acima, eu recebo:

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

A minha expectativa era de que eu posso passar um proc a um método se o método é definido com este tipo de assinatura:

def foo(&a)

e então eu posso executar o foo proc insiide assim:

 a.call(5)
Foi útil?

Solução

Se você quiser passar um proc real para foo, apenas defini-lo com def foo(a). Colocar o & na frente dos meios a "este não é realmente um argumento. Em vez levar o bloco passado para este método, crie um proc fora dele, e loja que proc na variável a". Em outras palavras, com sua definição atual, você pode chamar foo como esta:

foo do |x|
  puts x*2
end

Você também pode usar & ao chamar um método para transformar uma proc em um bloco:

foo(&s)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top