Acessar variáveis externas ao reabrir classe [resolvido]

1 resposta
tnaires

Pessoal,

Quero construir um método que receba um hash e retorne um objeto contendo um acessor para cada chave do hash.
def build(hash)
  o = Object.new

  hash.each do |k, v|
    class << o
      attr_accessor k
    end

    # Inicializando os atributos com o valor correspondente
    o.send(k.to_s + '=', v)
  end

  o
end
O problema é que a variável "k" não é visível na linha 6. Como posso contornar isso sem criar uma variável global?

1 Resposta

tnaires
OK pessoal, resolvi dessa forma:
def build(hash)
  o = Object.new

  def o.metaclass
    class << self; self; end
  end

  hash.each do |k, v|
    o.metaclass.instance_eval do
      attr_accessor k
    end

    # Inicializando os atributos com o valor correspondente
    o.send(k.to_s + '=', v)
  end

  o
end
EDIT - Sem declarar o método "metaclass"
def build(hash)
  o = Object.new

  hash.each do |k, v|
    (class << o; self; end).instance_eval do
      attr_accessor k
    end

    # Inicializando os atributos com o valor correspondente
    o.send(k.to_s + '=', v)
  end

  o
end
Criado 17 de janeiro de 2011
Ultima resposta 18 de jan. de 2011
Respostas 1
Participantes 1