2010-08-11 13 views
1

我正在閱讀Ruby中的Metaprogramming。在這本書中,當我讀到scopegates,下面的代碼被證明Ruby中的ScopeGates

my_var = "Success" 

MyClass = Class.new do 
    puts "#{my_var} in the class definition" 

    define_method :my_method do 
    puts "#{my_var} in the method" 
    end 
end 

MyClass.new.my_method 

=>Success in the class definition 
    Success in the method 

現在,當我中的以下執行,我得到一個錯誤說未定義的方法my_method MyClass.new MyClass的:0x00000100936a30

MyClass.my_method 
NoMethodError: undefined method `my_method' for MyClass:Class 
from (irb):11 
from /usr/local/bin/irb:12:in `<main>' 

爲什麼my_method被創建,它被調用爲MyClass.new.my_method而不是MyClass.my_method?

回答

1

define_method方法將一個實例方法添加到類中。當您在匿名類中調用define_method時,您的方法將作爲實例方法添加。要將其作爲類方法添加,您必須將其添加到元類中。

最簡單的方法是使用class << self語法。

MyClass = Class.new do 
    class << self 
    define_method(:my_method) do 
     puts "class method" 
    end 
    end 
end 

MyClass.my_method # => "class method" 
+0

感謝您的回答:) – felix 2010-08-11 07:15:37

+0

但現在您遇到了'class << self'不是範圍門的問題;)(這對讀者來說是一個很好的練習) – thorncp 2010-08-11 19:40:52