rails - Funciones de Ruby vs métodos
que significa en ruby (3)
En el lenguaje de programación Ruby , Capítulo 6 (segundo párrafo), dicen:
Muchos idiomas distinguen entre funciones, que no tienen ningún objeto asociado, y métodos, que se invocan en un objeto receptor. Debido a que Ruby es un lenguaje puramente orientado a objetos, todos los métodos son verdaderos y están asociados con al menos un objeto.
Y luego en el medio del sexto párrafo:
Ambos procs y lambdas son funciones en lugar de métodos invocados en un objeto.
Estoy un poco confundido acerca de estas declaraciones. ¿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?
Cualquier ayuda para analizar y entender esto sería apreciada.
Creo que la distinción es entre los métodos y la función de primer orden, es decir. funciones que pueden transmitirse como valores.
Procs y lambdas son ambos objetos en sí mismos, con un método de 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 a la call
.
lambda
s en Ruby son objetos de la clase Proc. Proc
objetos Proc
no pertenecen a ningún objeto. Se llaman sin vincularlos a un objeto.
Los métodos son objetos de cualquiera de los Method
clase o UnboundMethod
, dependiendo de si están enlazados o no. Vea 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
UnboundMethod
a un objeto y luego llamarlo. Pero no puedes bind
un Proc
a un objeto en absoluto. Sin embargo, los objetos Proc
pueden capturar variables locales en el ámbito circundante, convirtiéndose en cierres.