2012-06-05 3 views
0

Я пытаюсь создать пользовательский attr_accessor, но, похоже, не может заставить его работать. Вместо того, чтобы возвращать значение, присвоенное писателю, оно возвращает переменную экземпляра. Есть идеи?Проблемы с отправкой и define_method

class Object 
    def custom_attr_accessor(klass, attribute) 
    ivar = "@#{attribute}".to_sym 
    writer_body = lambda { |arg| instance_variable_set(ivar, arg) } 
    reader_body = lambda { ivar } 
    klass.send(:define_method, "#{attribute}=".to_sym, &writer_body) 
    klass.send(:define_method, "#{attribute}".to_sym, &reader_body) 
    end 
end 

class Person 
end 

custom_attr_accessor(Person, :age) 

me = Person.new 
me.age = 100 
puts me.age 

=> @age

ответ

0

Так же, как вы сделали instance_variable_set, вам нужно instance_variable_get:

reader_body = lambda { instance_variable_get(ivar) } 

BTW, расширяя Object и пропускание класса не очень красиво. Попытайтесь сделать это Persion. custom_attr_accessor(:age), это будет намного больше ООП.

+0

Интересно. Я не знал о получении партнера. Я все еще смущен, почему переменная экземпляра не возвращается при вызове метода getter после его установки с помощью метода записи? Спасибо за примечание об определении custom_attr_accessor, но я просто что-то тестирую. На практике я установлю себя, вызвав его из текущего объекта. – Nathan

+0

'ivar' содержит имя вашей переменной экземпляра, а не значение самой переменной. Поэтому возвращается строка имени переменной. –

+0

Не следует ли оценивать эту переменную экземпляра при вызове метода? – Nathan

Смежные вопросы