代码之家  ›  专栏  ›  技术社区  ›  Obromios

自动加载模块中的类

  •  0
  • Obromios  · 技术社区  · 7 年前

    在宝石中我有一个文件

    #/lib/my_gem/dym/proximity.rb
    module MyGem
       module Dym
         class Proximity
         end
       end
    end
    

    module MyGem
       autoload 'Dym::Proximity', "my_gem/dym/proximity"
    end
    

    NameError: autoload must be constant name: Dym::Proximity
    

    module MyGem
       autoload :Dym::Proximity, "my_gem/dym/proximity"
    end
    

    给

    TypeError: :Dym is not a class/module
    

    :Dym::Proximity 不是一个结构良好的符号。

    我该怎么做?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Danilo Cabello    7 年前

    一次只能自动加载一个模块级别,因此需要引入一个中间文件。

    lib/my_gem/dym.rb 这意味着:

    # console.rb
    require_relative 'lib/my_gem'
    
    # lib/my_gem.rb
    module MyGem
      autoload :Dym, "./lib/my_gem/dym.rb"
    
      puts "The Dym::Proximity module isn't yet loaded!"
      Dym::Proximity
      puts "The Dym::Proximity module has been successfully loaded!"
    end
    
    # lib/my_gem/dym.rb
    module MyGem
      module Dym
        autoload :Proximity, "./lib/my_gem/dym/proximity.rb"
      end
    end
    
    # lib/my_gem/dym/proximity.rb
    module MyGem
      module Dym
        class Proximity
          puts 'Dym::Proximity module is loading!'
        end
      end
    end
    

    通过以下文件,我得到以下输出:

    ruby console.rb
    The Dym::Proximity module isn't yet loaded!
    Dym::Proximity module is loading!
    The Dym::Proximity module has been successfully loaded!
    

    推荐文章