d2:默认包模块(如__init__.py,但对于D)

时间:2012-04-05 13:48:44

标签: package d

考虑我有一个包含privatepackage模块的复杂树的大型库包 - 我们称之为funnylib。最终用户不希望直接触摸内部模块(如funnylib.foofunnylib.bar等),所以我想提供外部接口 - 就像这样:

funnylib.d:

public import funnylib.foo;
public import funnylib.bar;
public import funnylib.baz;

最终用户只需导入import funnylib。问题是D不允许同时拥有funnylib.dfunnylib/

D中是否有类似“默认包模块”的内容,就像Python中有__init__.py一样?如果不是,上述设计的正确方法是什么?

Update1:​​我考虑将iternal模块移动到funnylib_private这样的包,因此funnylib将导入正常,但这会降低保护成本(非常不受欢迎),因为funnylib将不再访问package受保护的符号,并将导致令人不快的文件布局。

2 个答案:

答案 0 :(得分:1)

创建一个简单的all模块,其中包含用于导入库的公共导入

module funnylib.all;

public import funnylib.foo;
public import funnylib.bar;
public import funnylib.baz;

答案 1 :(得分:1)

您不能拥有同名的模块和包。因此,例如,Phobos无法拥有std/algorithm.dstd/algorithm/sorting.dstd/algorithm.dstd/algorithm会发生冲突。典型的事情是ratchet freak describes,并使用名为all的模块,该模块公开导入该包中的所有模块。但是如果你想隐藏你正在使用子模块的事实,那么你可以简单地做一些像

这样的事情。
funnylib.d
_funnylib/foo.d
_funnylib/bar.d
_funnylib/baz.d

而不是文档_funnylib在任何地方,但这对ddoc不起作用,因为它将为每个_funnylib模块生成文档,并且它将生成的最多for funnylib.d是模块文档,因为它没有任何文档符号。模块系统的设计并不是说你要隐藏模块,就像你想要的那样。

现在, 目前是proposal under discussion,因为它可以在模块太大时将模块干净地拆分成一个包(例如,当你拆分时{{1}进入std.algorithmstd.algorithm.search等明确使用std.algorithm.sorting的代码即使现在是std.algorithm.countUntil也不会中断。一旦整理好了,你可以使用它,但文档仍然会为每个子模块完成,而不是你的超级模块。它实际上是一种转换代码的方法,而不是试图隐藏你正在拆分模块的事实。它基本上只相当于使用std.algorithm.search.countUntil模块但具有一些语义糖,以避免在包曾经是单个模块的情况下破坏代码。