Добавление переменной экземпляра класса и attr_reader к классу Ruby во время выполнения? - PullRequest
3 голосов
/ 26 декабря 2010

Как добавить переменную экземпляра класса, данные для нее и attr_reader во время выполнения?

class Module
  def additional_data member, data
    self.class.send(:define_method, member)  {
      p "Added method #{member} to #{name}"
    }
  end
end

Например, учитывая этот класс

class Test
  additional_data :status, 55
end

Так что теперь яможно позвонить:

p Test.status # => prints 55

Ответы [ 2 ]

4 голосов
/ 26 декабря 2010

Как насчет этого?

class Object
  def self.additional_data(name, value)
    ivar_name = "@#{name}"

    instance_variable_set(ivar_name, value)

    self.class.send(:define_method, name) do
      instance_variable_get(ivar_name)
    end

    self.class.send(:define_method, "#{name}=") do |new_value|
      instance_variable_set(ivar_name, new_value)
    end
  end
end

class Foo
  additional_data :bar, 'baz'
end

puts Foo.bar # => 'baz'
Foo.bar = 'quux'
puts Foo.bar # => 'quux'

Это довольно очевидно, но дайте мне знать, если у вас есть вопросы.

4 голосов
/ 26 декабря 2010

Module#class_eval - это то, что вы хотите:

def add_status(cls)
  cls.class_eval do
    attr_reader :status
  end
end

add_status(Test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...