【问题标题】:Getting all imported modules with traits获取所有具有特征的导入模块
【发布时间】:2016-09-18 09:35:28
【问题描述】:

有没有一种方法可以获取所有导入的模块或其他方式?据我所知,“allMembers”不包括导入的成员。

我想要实现的是从导入的模块中导入所有成员,但这似乎并不像我想象的那么容易。如果我指定导入的完整模块,我可以轻松获得我想要的成员,但如果我使用当前模块本身,则不能。

所以我的问题是,有没有办法在 D 中获取所有导入模块的名称,因为这样我可以创建在模块上使用“allMembers”的动态方式。

为了证明我的意思。

假设我们有模块 a。

module a;

import b;
import c;

...

foreach (member; __traits(allMembers, a)) {
    // members of b and c will not come here ...
}

即使 b 和 c 的导入是公开的,它们也不会来。

我想做的就是在那里检索它们。

【问题讨论】:

  • bc 的导入不会包含在 allMembers 中,但 bc 本身会。如果您可以使用一些 isModule(alias symbol) 模板(我不知道如何编写)过滤成员,则可以在每个模块上调用 allMembers 以获取导入的模块。
  • this excellent answer 可以帮到你
  • 就我而言,它们根本不包括在内。我会看看我能想出什么,但到目前为止,这些解决方案对我没有任何影响。 @rcorre,已经尝试过该解决方案,但并没有什么不同。我要避免的是全部手动输入模块名称,因为我必须在很多模块上进行操作。不过谢谢
  • 对此进行更新,这似乎只是包的问题。当我从一个模块中执行它时它可以工作,但是一旦我从一个包中执行它就会中断。谁能确认这是预期的行为还是?
  • @Bauss 我已经为一个相关功能整理了一个pull request,但是在我等待官方批准时它一直在等待。

标签: module d typetraits


【解决方案1】:

如果你导入到一个结构中,那么allMembers 应该可以工作;示例:

(https://dpaste.dzfl.pl/629ff05bdab0)

struct Packages {
    import std_meta = std.meta;
    import std_range = std.range;
    import std_range_interfaces = std.range.interfaces;
    import std_range_primitives = std.range.primitives;
    import std_traits = std.traits;
};

void main() {
    foreach (X; __traits(allMembers, Packages)) {
        pragma(msg, __traits(allMembers, __traits(getMember, Packages, X)));
    };
};

……还有一些我现在记不太清的警告。

如果您还希望“正常”导入模块,您可以从模块名称列表中生成字符串混合。可能有很多方法可以解决这个问题。 (除非有人特别询问,否则我不会详细说明)


std-underscore hack 中,我在__traits(compiles__traits(getProtection 的帮助下使用了这种技术。因此,如果您打算做类似的事情,您可能需要检查一下。

实际上并没有你想象的那么脆弱。我现在在每个项目中都使用 std-underscore

【讨论】:

  • 但这需要您手动导入每个包。问题是我有多个嵌套包,所以一个包可以导入其他包。在这种情况下,这还不够,除非它照顾好它。我为解决这个问题所做的就是废弃整个包系统,直接使用像包一样的模块
  • @Bauss 不幸的是,似乎有一些编译器错误阻止了对导入的递归自省。例如,请参阅:pastebin.com/EiJfnbZv — 当 foo 是一个公开导入其他模块的模块时,这两对 pragma(msg 语句在它们应该都等效时打印不同的结果。所以现在这是我能做的最好的了。
  • 是的,我知道,我知道所有这些变通方法,但它们都不是那么好。这就是我提出这个的原因,因为我想防止更多的hacky hacky。 D 很不错,但是像这样的小错误使它不值得,因为它具有所有这些很酷的功能,它们只是不能很好地工作,它们只能工作。我通常最终会为这类事情编写工具,然后在编译时调用它们,但最终这一切都只是一团糟,有很多变通方法:p 你明白吗?这比几年前我第一次开始使用 D 时要好得多
猜你喜欢
  • 2021-03-08
  • 2011-03-30
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 2011-07-28
  • 1970-01-01
相关资源
最近更新 更多