我有一个由两部分组成的问题

Best-Practice

  • 我有一个算法,使用公共接口对数据 struct 执行一些操作
  • 目前,它是一个包含许多静态方法的模块,除了一个公共接口方法之外,所有方法都是私有的.
  • 有一个实例变量需要在所有方法之间共享.

以下是我能看到的选项,哪一个是最好的

  • Module和静态(ruby中的"模块")方法
  • Class个,用静态方法
  • 包含在数据 struct 中的Mixin个模块
  • Refactor找出算法中修改数据 struct (非常小)的部分,并使其成为一个调用算法模块静态方法的mixin

Technical part

有办法赚private Module method美元吗?

module Thing
  def self.pub; puts "Public method"; end
  private
  def self.priv; puts "Private method"; end
end

The 100 in there doesn't seem to have any effect,我仍然可以毫无疑问地拨打Thing.priv.

推荐答案

我认为实现这一点的最佳方式(主要是现有lib的编写方式)是在模块内创建一个处理所有逻辑的类,而模块只是提供了一个方便的方法,例如.

module GTranslate
  class Translator
    def perform(text)
      translate(text)
    end

    private

    def translate(text)
      # do some private stuff here
    end
  end

  def self.translate(text)
    t = Translator.new
    t.perform(text)
  end
end

Ruby相关问答推荐

当bsearch将数组中的第一个元素与2个值匹配时,它返回nil.为什么?

为什么我的二维 Ruby 数组的多个值会发生变化,尽管只更改了其中一个?

有没有办法在 Capybara 中保持登录状态?

Ruby 的 .() 运算符是如何工作的?

在 MacOS Sierra 上使用 RMagick 2.16 的 ImageMagick 7 找不到 MagickWand.h

Windows 上的 Jekyll:Pygments 不工作

在 Ruby 中,如何确定字符串是否不在数组中?

如果浮点组件不是 .00 sprintf/printf,则仅显示小数点

我可以在 Ruby 中使用默认值创建一个数组吗?

Python 是否在 Ruby 中进行类似于字符串 #{var}的变量插值?

按可能为 nil 的属性对对象的 ruby​​ 数组进行排序

我可以在 Ruby 2.x 中要求命名参数吗?

如何引用全局变量和类变量?

Ruby Koan 151 引发异常

线程安全:Ruby 中的类变量

Ruby数组限制方法

如何在 Ruby 中编写复杂的多行 if 条件?

如何使用#{variable}在Ruby中格式化带有浮点数的字符串?

Ruby:是否可以在模块中定义类方法?

为什么我们在 Ruby 中有 0.0 和 -0.0?