1

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

有趣的lib.d:

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

像最终用户一样import funnylib被导入。问题是 D 不允许同时拥有funnylib.dfunnylib/

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

更新1 : 我考虑过将内部模块移动到类似的包funnylib_private中,这样funnylib可以很好地导入,但这会降低保护成本(非常不希望),因为funnylib将不再访问package受保护的符号,并且会导致文件布局不愉快。

4

2 回答 2

1

使用记录在案的公共导入创建一个简单的all模块以导入库

module funnylib.all;

public import funnylib.foo;
public import funnylib.bar;
public import funnylib.baz;
于 2012-04-05T14:23:30.363 回答
1

您不能拥有同名的模块和包。因此,例如,Phobos 不能有 astd/algorithm.d和 a std/algorithm/sorting.dstd/algorithm.d并且std/algorithm会发生冲突。典型的做法是棘轮怪胎描述并使用一个名为all的模块,该模块公开导入该包中的所有模块。但是如果你想隐藏你正在使用子模块的事实,那么你可以简单地做类似的事情

funnylib.d
_funnylib/foo.d
_funnylib/bar.d
_funnylib/baz.d

并且没有_funnylib在任何地方记录,但这不适用于 ddoc,因为它会为每个_funnylib模块生成文档,并且它会生成的最多的funnylib.d是模块文档,因为它没有任何要记录的符号。模块系统的设计理念不是您将要像您尝试做的那样隐藏模块。

现在,目前正在讨论一个提案,以便在模块变得太大时将其干净地拆分为一个包(例如,当您拆分std.algorithmstd.algorithm.search,std.algorithm.sorting等时,明确使用的代码std.algorithm.countUntil不会中断,即使现在是std.algorithm.search.countUntil)。一旦解决了,你就可以使用它,但是文档仍然会为每个子模块完成,而不是你的超级模块。它实际上是一种转换代码的方法,而不是试图隐藏您正在拆分模块的事实。它基本上相当于使用一个all模块,但在包曾经是单个模块的情况下,它带有一些语义糖以避免破坏代码。

于 2012-04-05T17:17:31.157 回答