Existem problemas de precedência do rubi no uso de proc.call vs. proc. []?
-
22-09-2019 - |
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?
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