d中的x宏
原文
C
中的X宏
非常适合从表格数据
生成编译时代码
.尤其是对微控制器
上的引脚分配及其各自的功能,我还没有看到其他语言提供如此简洁
,易于维护的方式来交互和表示数据
.
挑战不大:
//你示例
enum Color { red, blue, green }
static immutable colorStrings = [EnumMembers!Color].map!text.array;
static foreach(color;EnumMembers!Color){ ... }
//维基1
auto value1=1,value2=2,value3=3;
alias vars=AliasSeq!(value1,value2,value3);
void printVariables(){
static foreach(alias var;vars){
writeln(__traits(identifier, var), " = ", var);
}
}
维基2:
enum id1=1, id2=2, id3=3;
static immutable varList = [
tuple("id1", "name1"),
tuple("id2", "name2"),
tuple("id3", "name3"),
];
static foreach(id, name; varList.map!(x=>x)){ // yuck
mixin(`int `~name~`;`);
}
mixin(`enum MyIdListType{`~varList.map!(x=>x[1]~"="~x[0]).join(",")~`}`);
不允许透明
添加新列,但我想我们需要实际元组模式匹配
(或通过索引
).
D颜色示例:
import std.traits, std.meta;
enum Color { red, blue, green }
enum getName(alias sym) = __traits(identifier, sym);
string[] colorStrings = [staticMap!(getName, EnumMembers!Color)];
unittest
{
assert(colorStrings[Color.red] == "red");
assert(colorStrings[Color.blue] == "blue");
assert(colorStrings[Color.green] == "green");
}
由于可访问D中强大的编译时反射
,可让枚举
成为"真相源",并生成数组.
好的,但是如果想为与枚举成员
串表示不同的名称
怎么办?简单:
import std.traits, std.meta;
struct name { string str; }
enum Color
{
@name("red") Cred,
@name("blue") Cblue,
@name("green") Cgreen
}
enum getName(alias sym) = getUDAs!(sym, name)[0].str;
string[] colorStrings = [staticMap!(getName, EnumMembers!Color)];
unittest
{
assert(colorStrings[Color.Cred] == "red");
assert(colorStrings[Color.Cblue] == "blue");
assert(colorStrings[Color.Cgreen] == "green");
}
在C中,每个附加数据"列"
都表示为X宏
的附加参数.由于D的UDA
允许附加任意数据
到包括枚举成员
的符号
,可转换
这些附加参数为枚举成员
的属性,并再次按真相源使用枚举
.
反射
的美妙在代码
仍然是代码且像自动补全
都正常工作.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现