说我在test.rb中有这个Ruby代码

module MyModule
  class TestClassA
  end

  class TestClassB
    def initialize
      a = Object.const_get('MyModule::TestClassA').new
    end
  end
end

在 ruby shell 中的一些测试以irb -r test.rb开始:
ruby-1.8.7-p302 > MyModule
 => MyModule
ruby-1.8.7-p302 > MyModule::TestClassA
 => MyModule::TestClassA
ruby-1.8.7-p302 > MyModule::TestClassA.new
 => #<MyModule::TestClassA:0x10036bef0>
ruby-1.8.7-p302 > MyModule::TestClassB
 => MyModule::TestClassB
ruby-1.8.7-p302 > MyModule::TestClassB.new
NameError: wrong constant name MyModule::TestClassA
    from ./test.rb:7:in `const_get'
    from ./test.rb:7:in `initialize'
    from (irb):1:in `new'
    from (irb):1

Object.const_get('MyModule::TestClassA').new在控制台中工作时,为什么TestClassB的构造函数中的MyModule::TestClassA.new失败?
我也尝试过Object.const_get('TestClassA').new,但这也不起作用。

最佳答案

没有名为“MyModule::TestClassA”的常量,在名为MyModule的常量内部有名为TestClassA的常量。

尝试:

module MyModule
  class TestClassA
  end

  class TestClassB
    def initialize
      a = Object.const_get("MyModule").const_get("TestClassA").new
    end
  end
end

至于为什么它不起作用,这是因为::是运算符而不是命名约定。

其他示例和信息可从http://www.ruby-forum.com/topic/182803获得

关于ruby - 通过字符串在模块中创建类的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6102234/

10-12 12:20