2013-02-14 71 views
2

爲了更好地理解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的魔法的一部分,但是究竟是什麼使得這個工作成爲可能?

回答

2

當Ruby解釋器看到obj.name = "A string,它會忽略name=之間的空格,然後在obj上查找名爲name=的方法。

+0

呃哦,那個我的閱讀理解,我好像回答了錯誤的問題:],對於你的+1。 – 2013-02-14 14:49:25

-1

沒關係,「字符串」是一個非常好的消息名稱,只是嘗試

obj.send "A string" # ^_^ 

你甚至可以使用數字:

o = Object.new 
o.define_singleton_method "555" do "kokot" end 
o.send "555" 
+0

好的,我回答了不同的問題,比你問這裏:) – 2013-02-14 14:54:29

相關問題