包含模块在 gem 中不工作

Include module not working in gem

我有一个叫 private_lib 的 gem。 文件 lib/private_lib.rb 包含以下内容:

require 'private_lib/version'
require 'private_lib/handicap'
require 'private_lib/traversal_cap'

module PrivateLib

end

lib/private_lib/handicap.rb 文件包含以下内容

# module for handicap functions
class Handicap
  include TraversalCap
  -- other code
end

并且文件 lib/private_lib/traversal_cap.rb 包含以下内容

module TraversalCap
  def some_method
  end
  -- other code
end

我还有一个测试文件spec/handicap_spec.rb,其中包含以下内容

require "spec_helper"
describe Handicap do
  include TraversalCap
  -- some tests that access the ```Handicap``` class
  -- some tests that access directly the traversal_cap some_method.
end

当我运行rspec spec/handicap_spec时,出现以下错误

private_lib/lib/private_lib/handicap.rb:3:in `<class:Handicap>': uninitialized constant Handicap::TraversalCap (NameError)
    from private_lib/lib/private_lib/handicap.rb:2:in `<top (required)>'

为什么障碍 class 看不到 traversal_cap 模块?

这是因为您需要文件的顺序。

当行 require 'private_lib/handicap' 为 运行 时,它会读取 handicap.rb 文件并找到您 include TraversalCap 所在的行。但是此时你还没有 运行 require 'private_lib/traversal_cap' 所以模块是未定义的。

快速修复是更改 require 调用的顺序,或者将 require 'private_lib/traversal_cap' 放在让分文件的顶部。