Ruby 组织宝石结构

Ruby 组织宝石结构,ruby,gem,metaprogramming,faker,Ruby,Gem,Metaprogramming,Faker,我写gem,它是对fakergem的补充(具有俄罗斯的功能,如税收和增值税等) 因此,我遇到了一个问题:每段代码都很大,所以我需要将其拆分为逻辑部分 IE我有Inn功能,称为Faker::russic.Inn() 所以,我写 Dir['faker/russian/*.rb'].each { |file| require file } module Faker class Russian extend Inn end end 否则我有(在faker/俄语/inn.rb)这个文件

我写gem,它是对
faker
gem的补充(具有俄罗斯的功能,如税收和增值税等)

因此,我遇到了一个问题:每段代码都很大,所以我需要将其拆分为逻辑部分

IE我有
Inn
功能,称为
Faker::russic.Inn()

所以,我写

Dir['faker/russian/*.rb'].each { |file| require file }

module Faker
  class Russian
    extend Inn
  end
end
否则我有(在
faker/俄语/inn.rb
)这个文件(这是必需的)

module Inn
  def inn ; puts 'inn goes here' ; end
end
但是我有一个错误:
lib/faker/russian.rb:5:in':未初始化的常量faker::russian::Inn(namererror)


如何避免此错误并成功地自动包含代码和扩展所有连接的模块?

选项1是在扩展时引用顶级命名空间

extend ::Inn
选项2是使用正确的名称空间定义Inn

module Faker
  module Russian
    module Inn
      def inn; end
    end
  end
end

在一个gem中,选项2最好将所有模块命名在这个gem的顶级模块下。想象一下,如果您使用选项1,并且在应用程序中有一个Inn模块,但没有gem,您将遇到问题。

选项1是在扩展时引用顶级命名空间

extend ::Inn
选项2是使用正确的名称空间定义Inn

module Faker
  module Russian
    module Inn
      def inn; end
    end
  end
end

在一个gem中,选项2最好将所有模块命名在这个gem的顶级模块下。想象一下,如果您使用选项1,并且在应用程序中有一个Inn模块,但没有gem,您将遇到问题。

选项1是在扩展时引用顶级命名空间

extend ::Inn
选项2是使用正确的名称空间定义Inn

module Faker
  module Russian
    module Inn
      def inn; end
    end
  end
end

在一个gem中,选项2最好将所有模块命名在这个gem的顶级模块下。想象一下,如果您使用选项1,并且在应用程序中有一个Inn模块,但没有gem,您将遇到问题。

选项1是在扩展时引用顶级命名空间

extend ::Inn
选项2是使用正确的名称空间定义Inn

module Faker
  module Russian
    module Inn
      def inn; end
    end
  end
end

在一个gem中,选项2最好将所有模块命名在这个gem的顶级模块下。想象一下,如果您使用选项1,并且在应用程序中有一个Inn模块,但没有gem,您将遇到问题。

我使用第二种方式,但仍然得到以下结果:
”:未初始化的常量Faker::俄语::Inn(NameError)
第一种方式也不起作用。我得到
”:未初始化的常量Inn(namererror)
。也许我不需要文件?我明白了。#2中存在名称冲突。模块名为“俄语”,而类名也为“俄语”。给他们合适的名字,他们应该会没事。我使用第二种方法,但仍然得到这样的结果:
”:未初始化的常量Faker::俄语::Inn(namererror)
第一种方法也不起作用。我得到
”:未初始化的常量Inn(namererror)
。也许我不需要文件?我明白了。#2中存在名称冲突。模块名为“俄语”,而类名也为“俄语”。给他们合适的名字,他们应该会没事。我使用第二种方法,但仍然得到这样的结果:
”:未初始化的常量Faker::俄语::Inn(namererror)
第一种方法也不起作用。我得到
”:未初始化的常量Inn(namererror)
。也许我不需要文件?我明白了。#2中存在名称冲突。模块名为“俄语”,而类名也为“俄语”。给他们合适的名字,他们应该会没事。我使用第二种方法,但仍然得到这样的结果:
”:未初始化的常量Faker::俄语::Inn(namererror)
第一种方法也不起作用。我得到
”:未初始化的常量Inn(namererror)
。也许我不需要文件?我明白了。#2中存在名称冲突。模块名为“俄语”,而类名也为“俄语”。给他们起个合适的名字,他们就没事了。