Tengo un par de preguntas sobre los métodos, procedimientos y bloques de Ruby que me parecen bastante extrañas. No se trata tanto de sintaxis ni de función como la lógica detrás de las decisiones tomadas.Método de Ruby, Proc y confusión de bloques
Pregunta 1:
Por qué es que los bloques se puede pasar a métodos (por ejemplo cada uno) pero no se puede asignar a una variable?
Sé que puede pasarlos por alto en los procedimientos, es decir, p = Proc.new {...}
(se accede con &p
), pero no tiene mucho sentido hacer que el programador realice estos procedimientos.
Pregunta 2:
¿Por qué existe una diferenciación entre los métodos y procedimientos?
Por ejemplo, puedo lograr la tarea de definir una función y llamar a esa función en las dos formas siguientes:
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, tanto la definición de una función de la manera estándar y por square = lambda x: x**2
realizan la misma tarea de crear la función y asignarla a square
.
Rubí afirma que todo es un objeto. Los bloques deben ser objetos para ajustarse a eso, y se pueden pasar como argumentos, por lo que definitivamente actúan como objetos de alguna manera. – rpjohnst
Se puede hacer que los bloques actúen como objetos mediante la creación de un objeto para representarlos, un proceso o una lambda. Sin ese dispositivo, son solo estructuras sintácticas. – Pinochle
Hay objetos de bloque: ese es el propósito de lambda {whatever}. – Chuck