dúvida em uma definição de classe

Caros,

alguém pode me ajudar a enteder o código abaixo?
(desculpem se a pergunta for muito noob mas estou começando com ruby e não encontrei a resposta que procuro no google nem aqui no fórum )

class Object def eigenclass class << self self # LINHA 1 end end end

O que significa o self na #LINHA 1? (Eu sei que é uma referência para uma instância de object. Pelo menos eu acho que sei =P )

Mas a questão é:

  • self está sendo tratado como um atributo?
  • algum tipo de retorno padrão?

Obrigado.

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 :smiley: