34
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_methoduseは新しいスコープを作成せずにインスタンス メソッドを作成できることも知っていますが、要点はクラス メソッドを定義する方法です。

4

3 に答える 3

73

クラス メソッドは実際には 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

しかし実際には、現在のバージョンの Ruby にも がModule#define_singleton_methodあるため、この特定のケースでは不要です。

C.define_singleton_method(:a_class_method) do
  puts var 
end
于 2010-08-15T13:53:49.600 に答える
1

この方法で簡単に行うことができます

class << C
  define_method(:a_class_method) do
     # do something
  end
end
于 2016-12-12T21:50:39.133 に答える