solomon segun psicologia michael kotler gratis edicion consumidor comportamiento capitulo autores ruby

ruby - segun - Método rubí, proc y bloqueo de confusión.



comportamiento del consumidor solomon capitulo 2 (3)

Tengo un par de preguntas sobre los métodos, procedimientos y bloqueos de Ruby que me parecen bastante extraños. No tienen tanto que ver con la sintaxis o la función como la lógica detrás de las decisiones tomadas.

Pregunta 1:

¿Por qué es que los bloques se pueden pasar a métodos (por ejemplo, cada uno) pero no se pueden asignar a una variable?

Sé que puede pasarlos por procedimientos, es decir, p = Proc.new {...} (se accede con &p ), pero no tiene mucho sentido hacer que el programador siga estos pasos.

Pregunta 2:

¿Por qué hay una diferenciación entre métodos y procedimientos?

Por ejemplo, puedo realizar la tarea de definir una función y llamar a esa función de las siguientes dos maneras:

def square(x) x**2 end square(3) => 9

o

square = lambda {|x| x**2} square.call(3) => 9

¿Por qué la diferenciación? En Python, por ejemplo, al definir una función de manera estándar y por square = lambda x: x**2 realice la misma tarea de crear la función y asignarla al square .


Al menos hasta cierto punto, los métodos son objetos:

class ABC def some_method end end ABC.instance_method(:some_method) #=> #<UnboundMethod: ABC#some_method>

Además, hay una clase incorporada: Método, como se documenta here .

Vea también esto: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Method_Calls

Sin querer, <bseg> , parece que más bien confirma lo que es todo-es-un-objeto. En este caso particular, parece que se necesita un poco más de investigación para ver.

(Realmente debo hacer un esfuerzo para entender esto mejor: estoy empezando a pensar que es fundamental para obtener una comprensión más profunda).


Los métodos son métodos, es decir, son acciones que un objeto puede realizar en respuesta a los mensajes. No son funciones.

Los bloques son cierres, son funciones que se cierran sobre el ámbito de aplicación. No "pertenecen" conceptualmente a un objeto dado.

En algunos idiomas, los métodos son simplemente funciones que son miembros de un objeto, pero Ruby no los ve de esta manera. Separar un método de su objeto propietario es más parecido a una cirugía que una simple asignación. Ruby toma su modelo de orientación a objetos de Smalltalk , el abuelo de la OO moderna.


Pregunta 1: Los bloques no son objetos, son estructuras sintácticas; Es por esto que no pueden ser asignados a una variable. Este es un privilegio reservado para los objetos.

Pregunta 2: Los métodos no son objetos, por lo que no pueden recibir mensajes. A la inversa, procs y lambdas son objetos, por lo que no pueden invocarse como métodos, sino que deben recibir un mensaje que les diga que devuelvan un valor en función de los parámetros pasados ​​con el mensaje.

Procs y Lambdas son objetos, por lo que pueden recibir el mensaje de call y asignarse a nombres. Para resumir, es ser un objeto que hace que procs y lambdas se comporten de una manera que te parezca extraña. Los métodos y los bloques no son objetos y no comparten ese comportamiento.