ruby 包含方法名称冲突

标签 ruby

如果一个类包含许多模块,并且从 include 中获得的方法调用其原始模块中的私有(private)方法,并且私有(private)方法存在于其他同名模块中,则它应该使用自己模块中的定义。在代码中:

module C
  def c
    puts collision
  end
  private
  def collision
    'c'
  end
end
module B
  def b
    puts collision
  end
  private
  def collision
    'b'
  end
end
class A
  include B
  include C
end
A.new.b
# => 'c'

我期望 A.new.b'b'A.new.c'c' 但因为它们使用相同的私有(private)方法名称而存在冲突。在包含许多包含的大型项目中,如何避免这种情况?

最佳答案

我假设真正的问题是:我如何确保我的模块没有使用其他模块方法,这些方法(意外地具有相同的名称)。

如果您能确保您的模块方法不依赖于状态并将它们定义为模块方法并以这种方式使用它们,那是最好的。因此,您显式地使用任何 helping 方法,如下所示:

module C
  def c
    puts C.collision
  end
  def self.collision
    'c'
  end
end

module B
  def b
    puts B.collision
  end
  def self.collision
    'b'
  end
end

class A
  include B
  include C
end

A.new.b # b
A.new.c # c

如果你想让它们成为私有(private)的,有一些额外的代码可以放在那里,你可以阅读一篇关于它的清晰文章:https://6ftdan.com/allyourdev/2015/05/02/private-module-methods-in-ruby/

this answer 中所述没有任何魔法可以使它工作。包含机制非常简单,(IMO)它应该保持这种状态。由于您已经意识到这个碰撞问题 - 您现在可以避免它。

如果你不喜欢这种方法,你也可以将真正的工作封装在一个类中并使用模块来包含:

  module C
    def c
      MyLibStuff::ClassDoingRealWork.no_collision_here_anymore(any, param, if_needed)
    end
  end

关于ruby 包含方法名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46265212/

相关文章:

ruby-on-rails - Rails - 从自定义/不同文件夹渲染模板

ruby - 返回 Ruby 中字符串中所有正则表达式出现的索引

ruby-on-rails - bool 属性的命名约定

ruby-on-rails - Ruby:如何将对象更改为可读的内容

ruby-on-rails - 您将如何解析 Ruby 中的 url 以获取主域?

ruby-on-rails - Ruby Sequel 或 ORM 检测 SQL 查询以进行慢速查询日志分析的工具或补丁

ruby-on-rails - 对于 ruby​​ 中的对象散列, hash.keys.index(obj) 有效但 hash.has_key?(obj) 无效。为什么?

ruby - "cannot find -lucontext"在新推送的 docker 镜像 ruby​​ :2. 7.4-alpine3.13 上安装一些 ruby​​gems 时

ruby - 其他文件中的 Rake 任务

ruby - Ruby 性能中的计时器