2012-02-01 18 views

Respuesta

11

Es porque los métodos de Ruby no son objetos de primera clase (como lo serían en IO, por ejemplo). Entonces, cuando defines el método interno, ¿qué es el receptor? Presumiblemente el método en sí, o el enlace o algo así, pero Ruby no tiene esa profundidad de OO.

De todos modos, no está claro para mí lo que esperabas que ocurriera en tu ejemplo, ¿querías que modificara el varialbe local a? Si es así, un proceso es un sustituto adecuado para un método.

def test 
    a = "a is for apple" 
    inner_method = lambda do 
    a = "something" 
    end 

    a # => "a is for apple" 
    inner_method.call 
    a # => "something" 
end 

test 

"functional.rb" es un ejemplo más extravagante de este estilo de programación.

Y "lambda, proc, and Proc.new" es un desglose de los diferentes tipos de cierres de Ruby.

+0

Parece fuera de lugar cuando todo lo demás tiene alcance léxico. –

+5

"Todo lo demás"? Excepto por bloques, * nada * tiene alcance léxico. No cuerpos de métodos. No cuerpos de clase. No cuerpos de módulo. No cuerpos de guiones. * Los bloques * son los que están "fuera de lugar". –

+3

Los métodos de Scala tampoco son objetos de primera clase, pero los métodos internos se cierran sobre los entornos de sus métodos circundantes. Hay una razón mucho más simple por la cual el "método interno" no se cierra sobre su método externo: porque * no es * un "método interno". Es una definición de un método global. –

Cuestiones relacionadas