Perdi o memorando em algum lugar e espero que você me explique isso.
Por que o eigenclass de um objeto é diferente de self.class
?
class Foo
def initialize(symbol)
eigenclass = class << self
self
end
eigenclass.class_eval do
attr_accessor symbol
end
end
end
Minha linha de lógica que iguala o eigenclass com class.self
é bastante simples:
class << self
é uma maneira de declarar métodos de classe, em vez de métodos de instância. É um atalho para def Foo.bar
.
Portanto, dentro da referência ao objeto de classe, o retorno self
deve ser idêntico a self.class
. Isso ocorre porque class << self
configuraria self
para Foo.class
para definição de métodos / atributos de classe.
Estou apenas confuso? Ou isso é um truque furtivo de metaprogramação Ruby?
fonte
A resposta mais simples: o eigenclass não pode ser instanciado.
class F def eigen class << self self end end end F.new.eigen.new #=> TypeError: can't create instance of virtual class
fonte
Yehuda Katz faz um bom trabalho ao explicar as sutilezas em " Metaprogramação em Ruby: é tudo sobre você "
fonte