Manera más natural de Proc de llamadas en Ruby 1.9
Pregunta
Como sabemos, hay varias manera de Proc de llamadas en Ruby 1.9
f =->n {[:hello, n]}
p f[:ruby] # => [:hello, :ruby]
p f.call(:ruby) # => [:hello, :ruby]
p f.(:ruby) # => [:hello, :ruby]
p f === :ruby # => [:hello, :ruby]
Tengo curiosidad, ¿qué es más "natural" modo de llamada de Proc?'Natural', probablemente, significa más de Ciencias de la computación - como forma.
Solución
La segunda opción es por lejos el más utilizado.
p f.call(:ruby) # => [:hello, :ruby]
Esto hace que sea más similar a un método estándar.También, algunas bibliotecas que dependen de pato escritura a la hora de validar los argumentos de la comprobación de la disponibilidad de la #call
método.En este caso, el uso de #call
se asegura de que usted puede proporcionar una expresión lambda o cualquier otro objeto (incluyendo una Clase) que responde a #call
.
Rack
middlewares son un gran ejemplo de este convenio.El basic middleware puede ser una lambda, o puede proporcionar una lógica más compleja mediante el uso de clases.
Otros consejos
Siempre uso la opción 3. Teniendo en cuenta las ambigüedades sintácticas de poder llamar a métodos sin paréntesis, esto es el más cercano que puede llegar a la sintaxis de la llamada de método real.
Vi la primera forma utilizada en el código fuente de rack .Me confundió en mucho tiempo.Se selecciona desde lib / rack / builder.rb ( versión: 1.6.0.alpha )
module Rack
class Builder
...
def to_app
app = @map ? generate_map(@run, @map) : @run
fail "missing run or map statement" unless app
# This is the first option calling a proc
# @use is a array of procs (rack middleware)
@use.reverse.inject(app) { |a,e| e[a] }
end
...
end
end