2009-05-29 35 views
27

En la Ruby Programming Language, Capítulo 6 (segundo párrafo) afirman:funciones de Ruby vs métodos

Muchos lenguajes distinguen entre funciones, que no tienen objeto asociado, y métodos, que se invocan en un receptor objeto. Debido a que Ruby es un lenguaje puramente orientado a objetos, todos los métodos son métodos verdaderos y son asociados con al menos un objeto.

Y luego, en la mitad del párrafo sexto:

Ambos procsos y lambdas son funciones en lugar de los métodos invocados en un objeto .

Estoy un poco confundido acerca de estas afirmaciones. ¿Ruby es verdaderamente puro OO, y por lo tanto no tiene funciones que no están asociadas con objetos (si esa es una definición válida de OO puro), o son procs/lambdas asociados con el objeto Proc? ¿Cuál es la diferencia entre funciones y métodos en Ruby?

Se agradecerá cualquier ayuda en el análisis y la comprensión de esto.

Respuesta

21

lambda s en Ruby son objetos de clase Proc. Proc objetos no pertenecen a ningún objeto. Se llaman sin vincularlos a un objeto.

Los métodos son objetos de la clase Method o UnboundMethod, dependiendo de si están enlazados o no. Consulte la explicación here. Los métodos sin consolidar no se pueden llamar hasta que estén vinculados a un objeto.

lambda{|x| x}.class  # => Proc 
lambda{|x| x}.call(123) # => 123 

class Foo 
    def bar(baz) 
    baz 
    end 
end 

puts Foo.new.method(:bar).class  # => Method 
puts Foo.new.method(:bar).call(123) # => 123 

puts Foo.instance_method(:bar).class  # => UnboundMethod 
puts Foo.instance_method(:bar).call(123) # => throws an exception 

Puede bind un UnboundMethod a un objeto y luego llamarlo. Pero no puede bind a Proc a un objeto en absoluto. Sin embargo, los objetos Proc pueden capturar variables locales en el ámbito circundante, convirtiéndose en cierres.

5

Procs y lambdas son ambos objetos en sí mismos, con un método call que en realidad invoca el bloque asociado con el proceso (o lambda). Sin embargo, Ruby proporciona algo de azúcar sintáctica para invocarlos sin la llamada explícita al call.

+0

Sí, proc y lambdas son objetos Proc, pero ¿qué quieren decir con "son funciones en lugar de métodos". ¿Y cuál es la distinción? –

+0

Quiere decir que la oración en el medio del sexto párrafo es inexacta. –

+1

La diferencia es que, casi de manera universal, los procesos y lambdas solo se usan para su método asociado de "llamada". Nadie almacena métodos o valores adicionales con ellos. Entonces, como dice Kaptajn Kold, podemos usarlos ya que usaríamos funciones de primer orden en otros idiomas, aunque todavía sean objetos. – rampion