Я пытаюсь настроить автозагрузку для моих классов в новом проекте, используя Module#autoload
. Это почти работает - проблема в том, что при первом использовании константы для автозагрузки происходит ошибка с «неинициализированной константой», но при втором использовании константа работает, как и ожидалось.
Код, иллюстрирующий проблему:
init.rb:
# Load lib, other directories will be autoloaded
APPLICATION_ROOT=File.expand_path(File.dirname(__FILE__))
$:.unshift(APPLICATION_ROOT)
Dir.glob("#{APPLICATION_ROOT}/patches/*").each {|p| require p}
Dir.glob("#{APPLICATION_ROOT}/lib/*").each {|p| require p}
# Test autoloading
include Autoload
begin
puts Sprite.new.inspect
rescue
puts "Caught an error"
end
puts Sprite.new.inspect # will not error
пластыри / string.rb:
class String
def camelize
self.split("_").map{|word| word.capitalize}.join
end
end
Библиотека / autoload.rb:
module Autoload
Dir.glob("#{APPLICATION_ROOT}/app/*/*").each do |path|
classname = File.basename(path).gsub(/.rb$/,'').camelize
autoload classname.to_sym, path
end
end
приложение / модели / sprite.rb:
puts "Sprite Required!"
class Sprite
puts "Sprite Defining!"
def initialize
puts "Sprite Initialized!"
end
end
puts "Sprite Defined!"
Выход:
Sprite Required!
Sprite Defining!
Sprite Defined!
Caught an error
Sprite Initialized!
#<Sprite:0x000000024ee920>
Как мне получить желаемое поведение (без первоначальной ошибки)?