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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top