爲了更好地理解Ruby,我決定重新創建attr_accessor方法。成功地。我現在明白它是如何工作的,除了關於Ruby的語法糖的一個細節。下面是我創建attr_accessor中方法:Ruby的attr_accessor魔法定義方法
def attr_accessor(*attributes)
attributes.each do |a|
# Create a setter method (obj.name=)
setter = Proc.new do |val|
instance_variable_set("@#{a}", val)
end
# Create a getter method (obj.name)
getter = Proc.new do
instance_variable_get("@#{a}")
end
self.class.send(:define_method, "#{a}=", setter)
self.class.send(:define_method, "#{a}", getter)
end
end
我看到它的方式,我只定義了兩個方法,obj.name
作爲getter和obj.name=
作爲二傳手。但是當我在IRB中執行代碼並調用obj.name = "A string"
時,它仍然有效,即使我沒有空間定義該方法!
我知道這只是定義Ruby的魔法的一部分,但是究竟是什麼使得這個工作成爲可能?
呃哦,那個我的閱讀理解,我好像回答了錯誤的問題:],對於你的+1。 – 2013-02-14 14:49:25