简体   繁体   中英

NameError: uninitialized constant error

Given the following code:

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

This works as expected, outputting:

Test
Base

However if I split things up like this:

# 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

And execute with the following (from irb):

require_relative 'lib/backup'

I get this error:

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'

What am I missing?

Note: I couldn't post the above without adding more details. Stupid feature because in this case code is worth a thousand words. (this text allowed the question to be posted)

The problem is that you are requiring test.rb before your Base class is defined. One possible solution is to move your require to the bottom of base.rb .

Another possible solution is to remove your require from base and require both files in the correct order from backup .

Made the following changes to fix the problem:

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

module Backup; end

And removed the require_relative statement from lib/backup/destination/base.rb . This fixed the order of the require_relative statements. I mistakenly thought the files were required before anything was executed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM