【问题标题】:ruby module structure insightruby 模块结构洞察
【发布时间】:2015-10-19 18:36:52
【问题描述】:

我是 Ruby 新手,我正在制作一个 Ruby 包。 结构是:

eventsims (main folder)
  |__lib
     |__eventsims {subfolder)
     |  |__discrete.rb
     |  |__randgen.rb
     |  |__simevent.rb
     |  |version.rb
     |__eventsims.rb

如果我将所有代码放在我的三个模块文件(离散、randgen 和 simevent)中的 [eventsims.rb 文件中的“Eventsims”模块] 中,这很容易,但最多会有 1000 行代码我不想

现在我在 eventsim.rb 中有一个“需要”的代码行,它需要 eventsim 子文件夹中的所有这四个文件。

我可以使用所有模块,没有错误。 例如,在 discrete.rb 中,有一个名为 Discrete 的模块,其中的 Calculate 类有一个 expectval 方法:

这是我在使用 Rubygems 安装包后能够使用该包的方式

require "Eventsims"
a = Discrete::Calculate.new([1,0,4,2], [0.2, 0.4, 0.6, 1.0])
a.expectval()

如果是的话,这样做是否明智,因为我见过的这么多模块都会有这样的东西:

require "eventsims"
Eventsims::someclass.new

在我的情况下是 需要“事件模拟” 离散的::someclass.new

我担心所需文件及其命名空间的一致性。需要 eventsim 及其不同的 Discrete

抱歉这个问题太长了。

【问题讨论】:

    标签: ruby module packages


    【解决方案1】:

    与其他一些语言不同,Ruby 不会将文件系统名称与模块层次结构联系起来。如果您想要require "eventsims" 提供模块Discrete,您可以。这是否是一个好主意,由你决定——Ruby 不是你的妈妈。有两个潜在的陷阱:

    • Gem 用户可能会感到困惑,想知道如何使用您的 gem
    • 其他一些 gem 中的某个人也定义了 Discrete 并且您发生了冲突。

    这两种方法(具有不同的命名空间和更少的类型)之间的折衷方案是确实有一个顶级模块EventSims,如果用户想直接访问下一层,可以使用include

    # safe usage
    require 'eventsims'
    EventSims::Discrete::Calculate.new
    
    # easy usage
    require 'eventsims'
    include EventSims
    Discrete::Calculate.new
    
    # restricted easy usage
    require 'eventsims'
    module MyCode
      include EventSims
      Discrete::Calculate.new
    end
    EventSims::Discrete::Calculate.new
    

    这样,你仍然有命名空间,当你知道你的代码没有冲突时,你可以摆脱它。反过来(没有命名空间并在发生冲突时尝试隔离代码确实)要困难得多。

    【讨论】:

    • 从您的底部示例中,我可以在我的意思的三个不同文件中使用 Eventsim 模块。三个不同文件中的相同模块名称
    • 是的。 Ruby 重新打开已定义的类或模块以进行进一步修改没有问题。每个文件中都需要module EventSims; module Discrete; ... end; end 或类似名称;或者,在顶部文件 (eventsims.rb) 中使用 module EventSims; end,然后您可以在单个文件中使用 module EventSims::Discrete; ... end
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多