4

モジュールの名前空間の下にクラスがあります。

Module::Klass

Klassコンソールからアクセスでき、次のようになります。

Module::Klass

ただし、使用しようとすると:

"klass".constantize # Calling constantize on String

モジュールの名前空間を追加しないため、エラーになります。

だから、私の質問は次のとおりです。現在のコンテキストに従って文字列を定数化し、そのモジュールとともにクラス名を受け取る方法はありますか?

4

2 に答える 2

16

「現在のコンテキスト」とは、現在そのモジュール内にいることを意味する場合、その定数に直接アクセスできます。

module Foo
  class Bar
  end

  self.const_get('Bar') # => Foo::Bar
end

もちろん、外にいてもできますFoo

Foo.const_get('Bar') # => Foo::Bar
于 2013-09-02T18:10:24.590 に答える
7

定数化ではありません:

名前は、「::」で始まるかどうかに関係なく、最上位の定数の名前であると見なされます。字句コンテキストは考慮されません。

C = 'outside'
module M
  C = 'inside'
  C               # => 'inside'
  "C".constantize # => 'outside', same as ::C
end

ただし、const_get() を使用できます。

module MyModule
  class MyClass
    def self.greet
      puts 'hi'
    end
  end

  const_get("MyClass").greet  
end

--output:--
hi
于 2013-09-02T18:11:52.880 に答える