d替换工厂模式
因为正在弃用Object.factory()
,这里,因此需要方便的替代方案.
TraitsExpression:
__traits ( getModuleClasses [, TraitsArgument] )
特征参数
是模块名
或全限定导入
.
如果未指定TraitsArgument
,则默认为当前模块
.
它返回表示指定模块
中定义的全限定类
的串元组
.
如:
module test;
import std.stdio;
class C { }
pragma(msg, __traits(getModuleClasses));
pragma(msg, __traits(getModuleClasses, std.stdio);
//打印
tuple("test.C")
tuple("std.stdio.Stdio.Exception")
可附加".classinfo"
到这些串
中,以取这些模块
的类信息
.
见这里
我不得不说,我对该方法并不信服,原因有二:更通用的过滤
方法要好得多.
__traits(getMembers, symbolOrModule, function/class/struct/union/field)
__特征(取成员,符号或模块,函数/类/构/联/字段)
将是非常有用的,且允许显著简化
现有逻辑.
用例:注册Web
路由,ORM,CLI
处理.
但是该特征
不按当前运行时moduleinfo
那样工作,不是吗?
pragma(msg, __traits(getModuleClasses)); // A?
static if (cond) class B {}
pragma(msg, __traits(getModuleClasses)); // A, B?
class A { }
enum cond = true;
以上只是为了说明
,可能有traits
根据排序(结构成员
列表中的特征
)产生不同的结果
的更好的/实际的
示例,但目前没有编译器
来测试.
它产生:
tuple("B", "test2.A")
tuple("B", "test2.A")
如下会给你(更有用)实际类型
.我用了5分钟就写好了
template AllClasses(alias mod) {
import std.meta : AliasSeq;
alias result = AliasSeq!();
static foreach(m; __traits(allMembers, mod))
static if(is(__traits(getMember, mod, m) == class))
result = AliasSeq!(result, __traits(getMember, mod, m));
alias AllClasses = result;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!