2010-08-15 31 views
18
class C 
end 

var = "I am a local var outside" 

C.class_eval do 
    def self.a_class_method 
    puts var 
    end 
end 

我知道,這是不正確的,因爲def創建了一個新的範圍。 我也知道使用define_method可以創建一個實例方法而不創建一個新的範圍,但我的觀點是如何定義一個類方法如何動態定義一個會引用外部局部變量的類方法?

回答

44

類方法在Ruby中並不存在,它們只是類對象的單例方法。單例方法並不存在,它們只是對象的單例類的普通實例方法。

由於您已經知道如何定義實例方法(使用Module#define_method),因此您已經知道了您需要知道的所有內容。你只需要調用class_evalC的單例類,而不是C本身:

(class << C; self end).class_eval do 
    define_method(:a_class_method) do 
    puts var 
    end 
end 

當前的Ruby版本有singleton_class方法來簡化這個過程:的

C.singleton_class.class_eval do 
    define_method(:a_class_method) do 
    puts var 
    end 
end 

但實際上,當前版本紅寶石也有Module#define_singleton_method,所以,在這種特殊情況下,這是不必要的:

C.define_singleton_method(:a_class_method) do 
    puts var 
end 
+0

非常感謝你! – Croplio 2010-08-15 14:27:46

+0

很好的答案。你可以分享鏈接到類方法元編程ruby的文檔?謝謝 – mattgathu 2017-06-27 13:20:38

+0

@mattgathu:Ruby中沒有類方法。只有一種方法:實例方法。 – 2017-06-27 13:22:46

0

你可以簡單地這樣做

class << C 
    define_method(:a_class_method) do 
    # do something 
    end 
end 
相關問題