2011-07-10 5 views
7

Cuando escribo self, obtengo un valor de retorno main. Hice esta prueba:Si `main` es una instancia de` Object`, ¿por qué no puedo llamarlo?

main2 = Object.new 

Entonces puede llamar main2 y devuelve algo, pero cuando llamo main, se genera un error variable no definida. ¿Como sucedió esto?

Aquí está la suposición de que he encontrado en otro sitio acerca de cómo funciona este entorno de alto nivel:

class Object 
    Object.new.instance_eval do 
    def self.to_s 
     "main" 
    end 
    private 
    ## 
    # Your program gets inserted here... 
    ## 

    end 
end 

Tiene sentido para mí.

Respuesta

14

"What is the Ruby Top-Level?" es un artículo en el nivel superior de Ruby que explica todo lo que necesita saber.

Como un lado, sin embargo, puede acceder a main en cualquier lugar de su programa usando TOPLEVEL_BINDING.eval('self').

+0

excelente artículo que proporcionas, ahora tiene mucho sentido, por la forma en que aprendí #include Module.new, ¡me abre los ojos! ¡Gracias de nuevo! – mko

+0

por cierto, el remove to_s de la clase singleton de main es una excelente manera de ilustrar toda la estructura. ¡estupendo! – mko

1

Usted no puede referirse al objeto main directamente con algo así como

myvar = main 

No es posible hacer referencia a ella por su "nombre". Sin embargo, puede capturarlo en una variable denominada principal como esto

main = self 
puts main # => main 

"top-level object? top-level methods?" es información útil sobre el objeto principal por el propio inventor de Ruby.

+0

Ahora ahora main es solo un valor de retorno por el método to_s de su clase singleton, la forma en que puedo pasarlo a una variable es eliminar el to_s de su clase singleton y el self devolver la instancia real, y luego puede pasarlo, que lo que aprendí del artículo de @banister agradece por ustedes – mko

4

La evaluación de la expresión self en irb devuelve un objeto que imprime como principal. Aquí es una transcripción que debe ayudar:

$ irb 
>> self 
=> main 
>> main 
NameError: undefined local variable or method `main' for main:Object 
     from (irb):2 
>> self.inspect 
=> "main" 
>> self.class 
>> Object 

Al escribir main en IRB, se trata de evaluar la variable main cual no está declarado.

+1

Además, si cambia 'self.inspect' (para devolver' "foo" 'por ejemplo), self devolverá entonces" foo " –

Cuestiones relacionadas