dúvida em uma definição de classe

1 resposta
adolfo_eloy

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.

1 Resposta

ricardo.valeriano

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:

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
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 é: # (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 é #>, e o nome da classe dessa instância é: Class. Em outras palavras self é do tipo #> 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.
[url]http://blog.caelum.com.br/metaprogramacao-eigenclass-em-ruby/[/url].

Ajudou em algo? Vamos conversando porque o tema é divertido :D

Criado 28 de maio de 2011
Ultima resposta 17 de set. de 2011
Respostas 1
Participantes 2