如果一个类包含许多模块,并且从包含调用其原始模块的私有方法中获得的方法,并且私有方法存在于具有相同名称的其他模块中,则它应该使用来自其自身模块的定义。在代码中:
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'
Run Code Online (Sandbox Code Playgroud)
我希望A.new.b给予'b'和A.new.c给予'c'但存在冲突,因为它们使用相同的私有方法名称。在包含许多内容的大型项目中,如何避免这种情况?
我认为真正的问题是:如何确保我的模块不使用其他模块方法(它们意外地具有相同的名称)。
最好的是,您可以确保您的模块方法不依赖于状态,并将它们定义为模块方法并以这种方式使用它们。所以你明确地使用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
Run Code Online (Sandbox Code Playgroud)
如果您想将它们设为私有,则需要放置一些额外的代码,您可以阅读有关它的清晰文章:https://6ftdan.com/allyourdev/2015/05/02/private-module-methods-in-ruby /
正如这个答案中所述,没有什么魔法可以让它发挥作用。包含机制非常简单,(IMO)它应该保持这种方式。当您意识到这个碰撞问题时,您现在可以避免它。
如果您不喜欢这种方法,您还可以将实际工作封装在类中并使用模块来包含:
module C
def c
MyLibStuff::ClassDoingRealWork.no_collision_here_anymore(any, param, if_needed)
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
899 次 |
| 最近记录: |