13

定数が定義されたクラスがあります。次に、そのクラス定数にアクセスするクラス メソッドを定義します。これはうまくいきます。例:

#! /usr/bin/env ruby

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        def shout_my_constant
            puts Const.upcase
            end
        end
    end

NonInstantiableClass.shout_my_constant

次のように、このクラスメソッドを外部モジュールに移動しようとすると、私の問題が発生します。

#! /usr/bin/env ruby

module CommonMethods
    def shout_my_constant
        puts Const.upcase
        end
    end

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        include CommonMethods
        end
    end

NonInstantiableClass.shout_my_constant

Ruby はメソッドを、クラスではなくモジュールから定数を要求していると解釈します。

line 5:in `shout_my_constant': uninitialized constant CommonMethods::Const (NameError)

では、メソッドがクラス定数にアクセスできるようにするための魔法のトリックは何ですか? どうもありがとう。

4

3 に答える 3

16

これはうまくいくようです:

#! /usr/bin/env ruby

module CommonMethods
    def shout_my_constant
        puts self::Const.upcase
    end
end

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        include CommonMethods
    end
end

NonInstantiableClass.shout_my_constant

HTH

于 2009-12-13T21:02:16.270 に答える
13

モジュールをメタクラスに含める必要がないことに注意してください。

class NonInstantiableClass
    Const = "hello, world!"
    class << self
        include CommonMethods
    end
end

Rubyにはextend、モジュールインターフェースをクラスに効果的に追加するキーワードがあります。

class NonInstantiableClass
    Const = "hello, world!"
    extend CommonMethods
end

self::Constまたはconst_getを使用して正しい定数を参照していることを確認する必要がありますがextend <module>、これらのメソッドをクラスに追加するより良い方法です。

于 2009-12-13T21:28:10.193 に答える
9

問題は、単に記述した場合Const、モジュールの作成時に評価されることです。Module#const_get代わりに次のように使用する必要がありますconst_get(:Const)。これは、メソッドの実行時に実行時に評価されます。したがって、これはモジュールではなくクラスで発生します。

于 2009-12-13T21:07:49.173 に答える