【问题标题】:NameError: uninitialized constant errorNameError:未初始化的常量错误
【发布时间】:2015-12-10 19:31:52
【问题描述】:

给定以下代码:

module Backup
  module Destination
    class Base
      def initialize
        puts 'Base'
      end
    end
  end
end

module Backup
  module Destination
    class Test < Base
      def initialize
        puts 'Test'
        super
      end
    end
  end
end

Backup::Destination::Test.new

这按预期工作,输出:

Test
Base

但是,如果我这样拆分:

# lib/backup.rb
require_relative 'backup/destination/base'

module Backup; end


# lib/backup/destination/base.rb
require_relative 'test'

module Backup
  module Destination
    class Base
      def initialize
        puts 'Base'
      end
    end
  end
end


# lib/backup/destination/test.rb
module Backup
  module Destination
    class Test < Base
      def initialize
        puts 'Test'
        super
      end
    end
  end
end

并执行以下命令(来自 irb):

require_relative 'lib/backup'

我收到此错误:

NameError: uninitialized constant Backup::Destination::Base
    from /lib/backup/destination/test.rb:3:in `<module:Destination>'
    from /lib/backup/destination/test.rb:2:in `<module:Backup>'
    from /lib/backup/destination/test.rb:1:in `<top (required)>'
    from /lib/backup/destination/base.rb:1:in `require_relative'
    from /lib/backup/destination/base.rb:1:in `<top (required)>'
    from /lib/backup.rb:1:in `require_relative'
    from /lib/backup.rb:1:in `<top (required)>'
    from (irb):1:in `require_relative'

我错过了什么?

注意:如果不添加更多详细信息,我无法发布以上内容。愚蠢的功能,因为在这种情况下,代码值一千字。 (此文本允许发布问题)

【问题讨论】:

    标签: ruby


    【解决方案1】:

    问题是您在定义Base 类之前需要test.rb。一种可能的解决方案是将您的需求移动到base.rb 的底部。

    另一种可能的解决方案是从base 中删除您的需求,并从backup 中以正确的顺序要求这两个文件。

    【讨论】:

    • 谢谢。我错误地认为在执行任何操作之前都需要这些文件。
    【解决方案2】:

    进行了以下更改以解决问题:

    # lib/backup.rb
    require_relative 'backup/destination/base'
    require_relative 'backup/destination/test'
    
    module Backup; end
    

    并从lib/backup/destination/base.rb 中删除了require_relative 语句。这修复了require_relative 语句的顺序。我错误地认为在执行任何操作之前都需要这些文件。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-21
      • 1970-01-01
      • 2015-01-19
      • 2015-10-29
      相关资源
      最近更新 更多