我有一个嵌套的模块结构,仅用于命名空间;没有混入类等。所以我有这样的代码:
module Lib
module A
def A.foo
puts 'Lib::A::foo'
end
end
module B
def B.bar
puts 'Lib::B::bar'
end
end
end
现在假设我想在 module 中再添加一个辅助方法A
,并且我希望两个模块都可以轻松使用它。我得到以下信息:
module Lib
module A
def A.foo
puts 'Lib::A::foo'
end
def A.helper
puts 'Lib::A::helper'
end
end
module B
def B.bar
puts 'Lib::B::bar'
A::helper
end
end
end
它似乎工作,但它有一些我想摆脱的缺点:
我不想一直从内部调用helper
它的完整限定名(A::helper
)B
。我更愿意以某种方式告诉 Ruby 这个命名空间前缀是“默认的”,并简单地将其称为helper
. 在 C++ 中,我可以using A::helper
在命名空间内编写B
,它会解决问题。但是如何在 Ruby 中做到这一点?
我尝试添加include A
and extend A
inside B
,但它们都不起作用。它们似乎只在类中工作,当这些模块混合在一起时,但当它们是独立的,仅用于命名空间时则不行。
还有其他方法可以让它按我想要的方式工作吗?
哦,还有一件事:
假设一个不同的场景,我希望A::helper
只从 insideA
的方法中使用,因为它只是一些实现函数,我在其中分解出一些内部许多函数使用的通用代码A
,但现在我不'不希望它对外界可见,只是对A
'方法。我该怎么做?
我尝试使用module_function
+A.
从所有其他应该隐藏的函数中删除前缀,但是对于 中的其他方法,它们也被隐藏了A
,因为它们是实例方法,并且无法实例化模块。那么,我怎样才能对外界隐藏一个模块方法,并且仍然允许其他模块方法在内部使用它呢?
编辑 为什么要投票?我试图尽可能清楚,我需要在另一个名称空间中默认一个名称空间以完全摆脱长的完全限定名称(不仅仅是将它们别名为更短的名称),并且我的问题不关心类和对象,只是用于命名空间目的的普通模块。我还能怎么解释呢?
命名空间机制在 Ruby中似乎并没有像 C++ 等语言那样在本机中得到完全支持,这不是我的错,而且这似乎只是使用模块和类来拥有真正命名空间的某些功能的副作用(它们像鸭子一样嘎嘎,它们有鸭嘴,但它们是鸭嘴兽,而不是鸭子,不应该被宣传为它们显然不是的命名空间,因为它只会混淆从其他语言进入 Ruby 的人与真正的命名空间),也不如果它们在 Ruby 中不容易实现,那么您显然不理解其他编程语言的概念(因为我看到您似乎假装我的问题不存在并恢复到您可以解决的问题用 Ruby 轻松实现;但这不是我需要的)。
为什么与我的问题相关的唯一答案已被删除?不酷;。