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
可以創建一個實例方法而不創建一個新的範圍,但我的觀點是如何定義一個類方法。如何動態定義一個會引用外部局部變量的類方法?
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
可以創建一個實例方法而不創建一個新的範圍,但我的觀點是如何定義一個類方法。如何動態定義一個會引用外部局部變量的類方法?
類方法在Ruby中並不存在,它們只是類對象的單例方法。單例方法並不存在,它們只是對象的單例類的普通實例方法。
由於您已經知道如何定義實例方法(使用Module#define_method
),因此您已經知道了您需要知道的所有內容。你只需要調用class_eval
上C
的單例類,而不是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
你可以簡單地這樣做
class << C
define_method(:a_class_method) do
# do something
end
end
非常感謝你! – Croplio 2010-08-15 14:27:46
很好的答案。你可以分享鏈接到類方法元編程ruby的文檔?謝謝 – mattgathu 2017-06-27 13:20:38
@mattgathu:Ruby中沒有類方法。只有一種方法:實例方法。 – 2017-06-27 13:22:46