adolfo_eloy, como vai?
Primeiro vamos lembrar que em Ruby, tudo é objeto, inclusive uma classe.
Classe = Class.new
puts Classe.class
p Classe
Retorna:
Class
#<Class:0x100b25dd0>
Para conseguir te explicar melhor, vou fazer uma pequena alteração no seu exemplo, acho que pode facilitar o entendimento, pode ser? Considere o seguinte:
[code]class Teste
def eigenclass
class << self
self # LINHA 1
end
end
end
teste = Teste.new
p teste
puts teste.class
p teste.eigenclass
puts teste.eigenclass.class
[/code]
O retorno desse código é algo assim:
#<Teste:0x10e0551e0>
Teste
#<Class:#<Teste:0x10e0551e0>>
Class
O retorno acima nos diz que a classe de uma instância de teste é: #Teste:0x10e0551e0 (um objeto - pois toda classe é um objeto, instância de Class). E o nome dessa classe é Teste.
A classe de self, na linha em que você está interessado é #<Class:#Teste:0x10e0551e0>, e o nome da classe dessa instância é: Class. Em outras palavras self é do tipo #<Class:#Teste:0x10e0551e0> que por sua vez é uma instância de Class.
Todo objeto em Ruby, quando instanciado, ganha uma classe só prá ele, é essa classe que está referenciada por self na linha em que você indicou. O código:
instancia = Object.new
class << instancia
end
Serve para acessar - ou melhor dizendo: abrir - essa classe “oculta” que é pendurada em todo objeto instanciado em Ruby. Se você pode abrir essa classe, também pode adicionar métodos a ela. Quando fazemos uma chamada a um método em um objeto, o Ruby primeiro procura nessa classe oculta e depois procura em todo o caminho “natural”, na árvore de herança daquele objeto.
Tem um post do Anderson Leite que explica esse processo, não sei se foi lendo ele que surgiu sua dúvida, deduzo que sim pelo termo eigenclass usado em seu exemplo. Além desse termo essa classe oculta também é conhecida como Singleton Class ou Ghost Class.
http://blog.caelum.com.br/metaprogramacao-eigenclass-em-ruby/.
Ajudou em algo? Vamos conversando porque o tema é divertido