2012-06-05 69 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

有趣。我不知道得到的對手。我仍然困惑爲什麼實例變量在通過writer方法設置後調用getter方法時未返回?感謝關於定義custom_attr_accessor的注意事項,但我只是在測試一些東西。在實踐中,我會通過從當前對象中調用它來設置自己。 – Nathan

+0

'ivar'包含您的實例變量的名稱,而不是變量本身的值。因此返回變量名稱的字符串。 –

+0

調用方法時不應評估該實例變量嗎? – Nathan