gpt4 book ai didi

ruby 包含方法名称冲突

转载 作者:数据小太阳 更新时间:2023-10-29 07:58:33 24 4
gpt4 key购买 nike

如果一个类包含许多模块,并且从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com