【发布时间】:2013-09-06 07:04:45
【问题描述】:
我有一个嵌套的模块结构,仅用于命名空间;没有混入类等。所以我有这样的代码:
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
现在假设我想在模块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
它似乎有效,但它有一些我想摆脱的缺点:
我不想一直从B 内部调用helper 的全名(A::helper)。我更愿意以某种方式告诉 Ruby 这个命名空间前缀是“默认的”,并简单地将其称为helper。在 C++ 中,我可以在命名空间 B 内写 using A::helper,它会解决问题。但是如何在 Ruby 中做到这一点呢?
我尝试在B 中添加include A 和extend A,但它们都不起作用。它们似乎只在类中工作,当这些模块混合在一起时,但当它们是独立的,仅用于命名空间时。
还有其他方法可以让它按我想要的方式工作吗?
哦,还有一件事:
假设一个不同的场景,我希望 A::helper 只能在 A 的方法内部使用,因为它只是一些实现函数,我在其中分解出 A 内部许多函数使用的一些通用代码,但现在我不希望它对外界可见,只对A 的方法可见。我该怎么做?
我尝试使用module_function + 从所有其他应该隐藏的函数中删除A. 前缀,但是对于A 中的其他方法,它们也被隐藏了,因为它们是实例方法,并且模块不能被实例化。那么如何才能将一个模块方法对外界隐藏起来,并且仍然允许其他模块方法在内部使用它呢?
编辑 为什么要投反对票?我试图尽可能清楚,我需要的是默认一个命名空间在另一个命名空间内完全摆脱长的完全限定名称(不仅仅是别名它们更短),而且我的问题根本不涉及类和对象,只是用于命名空间目的的普通模块。我还能怎么解释呢?
命名空间机制在 Rubynative 中似乎不像在 C++ 等语言中那样完全支持,这不是我的错,而且它似乎只是一个副作用使用模块和类来具有真正命名空间的一些功能(它们像鸭子一样嘎嘎叫,它们有鸭嘴,但它们是鸭嘴兽,而不是鸭子,并且不应将它们宣传为它们显然不是的命名空间,因为它只会使从其他语言进入 Ruby 的人与真正的命名空间混淆),也不是你显然不理解其他编程语言的概念,如果它们不容易可能的话在 Ruby 中(因为我看到您似乎假装我的问题不存在并恢复到您在 Ruby 中可以轻松做的事情;但这不是我需要的)。
为什么与我的问题相关的唯一答案已被删除?不酷;。
【问题讨论】:
-
在不同的帖子中提出这些问题会更好......而不是在一个帖子中......我认为
标签: ruby oop module namespaces