En cada instante de la ejecución del programa, hay uno y sólo un self: el objeto que se está usando en ese instante.
El contexto del nivel superior se produce si no se ha entrado en otro contexto, por ejemplo, la definición de una clase. Por la tanto, el término "nivel superior" se refiere al código escrito fuera de las clases o módulos. Si abres un fichero de texto y escribes:
x = 1
habrás creado una variable local en el nivel superior. Si escribes:
def m
end
habrás creado un método en el nivel superior: un método que no es definido como un método de una clase o módulo. Si nada más arrancar el intérprete, tecleas:
puts self
La respuesta es main, un término que se refiere al objeto que se crea al iniciar el intérprete.
En una clase o definición de módulo, self es la clase o el módulo al que pertenece el objeto:
class S
puts 'Comenzó la clase S'
puts self
module M
puts 'Módulo anidado S::M'
puts self
end
puts 'De regreso en el nivel más superficial de S'
puts self
end
La salida es:
Comenzó la clase S
S
Módulo anidado S::M
S::M
De regreso en el nivel más superficial de S
S
class S
def m
puts 'Clase S, metodo m:'
puts self # <S:0x2835908>
end
end
s = S.new
s.m