2010-01-25 68 views
3

片段1:這兩個Ruby片段有什麼區別?

module A 
    def cm(m,ret) 
    class_eval do 
    define_method(m.to_sym) do 
     return ret 
    end 
    end 
    end 
end 

和代碼段2:

module B 
    def cm(m,ret) 
    class_eval do 
     "def #{m} #{ret} end" 
    end 
    end 
end 

在這些模塊中定義的方法將被用來創建一個類,即返回一定值的方法。這裏有一個例子:

class Whatever 
    extend A 
    cm("two",2) 
end 

,這將創建一個名爲2的方法,將返回2.事情是,在第二個片段的代碼不起作用。任何想法爲什麼?我認爲class_eval可能需要一個字符串。

回答

5

class_eval將字符串作爲參數,但是您已將字符串傳遞給塊中的函數。

試試這個:

module B 
    def cm(m,ret) 
    class_eval("def #{m}() #{ret} end") 
    end 
end 
+0

我仍然認爲這個定義本身看起來是錯誤的。是不是: 「def#{m}; return#{ret}; end」 – Jean 2010-01-25 09:00:07

+2

@Jean:當表達式是方法中的最後一個時,return關鍵字是可選的。所以在結束關鍵字之前或者在方法定義的參數列表之後是​​終止符。即'def five()5 end'是有效的語法。然而'def five 5 end'不是。 – sepp2k 2010-01-25 09:54:16