Pergunta

Recentemente, eu estava discutindo com um amigo sobre Ruby's Proc. Você pode ligar para um Proc de uma de várias maneiras. Uma maneira é invocar Proc.call:

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

Outro é usar aparelhos, Proc.[]:

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

Existem problemas de precedência em potencial aqui ou essas duas declarações são completamente intercambiáveis? Caso contrário, você pode fornecer um exemplo de contexto em que diferentes resultados seriam fornecidos?

Foi útil?

Solução

o #call A técnica permite que a precedência do operador obscureça a intenção:

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]"

o [] A sintaxe torna a associação sintática dos argumentos ao método mais robusto, mas você alcançaria o mesmo efeito colocando parênteses em torno dos argumentos para Proc#call.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top