Ruby: добавить метод в существующий класс - PullRequest
0 голосов
/ 30 марта 2012

Я новичок в Ruby и пытаюсь написать метод для динамического добавления методов в существующий класс ruby, вот что у меня есть:

class Person
end

def attr_addr (target, attr)
    target.send :attr_accessor, attr
end

bob = Person.new

attr_addr(Person,"name")

bob.name = "bob"

Но я получаю:

private method `name=' for ....

Что я здесь не так делаю? - я использую неправильный подход полностью; -)?

Ответы [ 2 ]

3 голосов
/ 30 марта 2012

Ваш оригинальный код работает на меня. Во всяком случае, вот еще один способ написать это:

def attr_addr(target, attr)
  target.instance_eval "attr_accessor :#{attr}"
end

Вот оно в действии в сеансе IRB:

>> bob = Person.new
=> #<Person:0x00000000df8798>
>> bob.name = "bob"
NoMethodError: undefined method `name=' for #<Person:0x00000000df8798>
        from (irb):6
        from /home/michi/.rbenv/versions/1.9.3-p0/bin/irb:12:in `<main>'
>> attr_addr(Person, "name")
=> nil
>> bob.name = "bob"
=> "bob"
>> bob
=> #<Person:0x00000000df8798 @name="bob">
0 голосов
/ 30 марта 2012

У меня работает (Ruby 1.8.7):

irb(main):001:0> class Person; end
=> nil
irb(main):003:0> Person.send :attr_accessor, :name
=> nil
irb(main):004:0> p = Person.new
=> #<Person:0x7f9716bad768>
irb(main):005:0> p.name = "test"
=> "test"
irb(main):006:0> p.name
=> "test"
...