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
useは新しいスコープを作成せずにインスタンス メソッドを作成できることも知っていますが、要点はクラス メソッドを定義する方法です。
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
useは新しいスコープを作成せずにインスタンス メソッドを作成できることも知っていますが、要点はクラス メソッドを定義する方法です。
クラス メソッドは実際には 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
しかし実際には、現在のバージョンの Ruby にも が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