2011-03-14 11 views
8

の構文を使用するのではなく、class << selfの定義の中でconst_missingと他のクラスメソッドを定義すると、Rubyの動作が大きく混乱します。"class << self"定義内に定数と "const_missing"がありません

私はこのような何かをしようとしていた。

class Foo 
    class << self 
    def foo 
     puts MISSING 
    end 

    def const_missing(name) 
     puts "#{name} missing" 
    end 
    end 
end 

Foo.foo 

私は主にクラスメソッドを定義するためにclass << self構文を使用します。しかし、期待どおりに動作しませんでした。 const_missingは呼び出されません。上記の結果はNameErrorになります。

def self.foo 
    puts MISSING 
end 

def self.const_missing(name) 
    puts "#{name} missing" 
end 

私はclass << self構文は、クラスメソッドを定義するだけで、別の方法が、def self.fooと完全に同等であることを考えた:これは期待どおりに動作よう

両方の方法を定義しますか?私は上記のMRI 1.8.7、1.9.2、JRuby 1.5.6をテストしました。だから明らかに私はここに何かを逃しているのですか?

いずれのヒントも大歓迎です。

おかげで、マーティン

答えて

12

class << selfは、クラスメソッドを定義するためのショートカットではありません。この構文(私は正確な命名法を知らない)は、オブジェクト(あなたの場合はクラス)からeigenclassを開きます。これで、オブジェクトにメソッドを定義できます(インスタンスメソッドではありません)。しかし、固有クラスに定数を呼び出すと、クラスからではなく、固有クラスから定数が呼び出されます。

class Test 
    class << self 
    def foo 
     p MISSING 
    end 

    # First way: (syntax sugar for the second way) 
    def self.const_missing(name) 
     name 
    end 

    # Second way: 
    class << self # eigenclass of the eigenclass of the class 
     def const_missing(name) 
     name 
     end 
    end 

    end 
end 

Test.foo #=> :MISSING 
+0

どうもありがとう、LBG:この場合、あなたはそれを行うにはconst_missing、二つの方法にeigenclass上のクラスメソッドを定義する必要があります。私は 'class << self'がクラスの固有クラスを開くことを知っていました。しかし、クラスメソッドは固有クラスのインスタンスメソッドなので、このように動作すると思っていました。しかし、固有クラスから参照される定数は、クラス自体から参照される定数と同じではないことは完全に意味します。時にはこのすべてのことが私の頭を回転させる:) – martido

関連する問題