我正在尝试创建自定义attr_accessor,但似乎无法让它工作。它不返回分配给writer的值,而是返回实例变量。有什么想法吗?
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 :(得分:0)
就像你做instance_variable_set
一样,你需要instance_variable_get
:
reader_body = lambda { instance_variable_get(ivar) }
顺便说一句,扩展Object
并传递一个类并不是很漂亮。尝试使它成为Persion. custom_attr_accessor(:age)
,这将是更多的OOP。