2604,dip2053的故事

张开发
2026/4/16 21:00:55 15 分钟阅读

分享文章

2604,dip2053的故事
原文DIP1053,元组的故事如果你用过D一段时间,你就知道元组的情况相当复杂.有内置元组,呃…编译时序列,还有一个库级封装器叫std.meta.AliasSeq,还有第二个稍有不同库级封装器std.typecons.Tuple.虽然可工作,但很麻烦.这里这里这里在DIP1053前,从一个函数返回多个值会有多个步骤.即使是std.typecons.Tuple,也麻烦.手动索引:访问结果[0]和结果[1].如果你更改返回顺序,这将是个错误.显式赋值:手动声明变量并挨个赋值.它大致如下:importstd.typecons;Tuple!(int,string)getResult(){returntuple(404,Not Found);}voidmain(){autoresgetResult();intcoderes[0];string msgres[1];}它冗长,麻烦,还强制你跟踪不想要的临时变量(res).于是,DIP1053登场:“反样板”DIP1053改变了局面,让编译器可理解你收到的数据结构,并在一个语句中,按不同变量解包它.语法简洁,直观.1.基本解包声明该DIP的核心功能是可直接从元组返回中声明新变量:voidmain(){//直接解包到新的变量中auto(status,message)getResult();writeln(Status: ,status);//404writeln(Message: ,message);//找不到}编译器会推导类型.状态变为整,消息变为串.如果想显式声明,可自己指定类型:(ints,string m)getResult();注意:解包声明必须指定至少一个类型或存储类,声明数量必须匹配元组中的元素数量.2.嵌套解包这些解包声明也支持嵌套元组.虽然内置的编译时序列和std.meta.AliasSeq禁止嵌套,但std.typecons.Tuple支持:auto(a,(b,c))tuple(1,tuple(2,3.0));(inta,(string b,doublec))tuple(1,tuple(2,3.0));这与Swift和Rust等语言中内置的匹配模式语法类似.它允许你精确限定变量域,同时保持逻辑平稳且易读.3.每一Foreach整合DIP1053不仅是函数返回;它还支持元组数组的每一循环:autoarr[tuple(1,2),tuple(3,4),tuple(5,6)];foreach((x,y);arr){writeln(x, ,y);//12\n34\n56}也支持一般的每一foreach存储类:autoarr[t(1,2),t(3,4)];foreach((ref x,y);arr){x2*y;}assert(arr[t(4,2),t(8,4)]);可在解包声明旁边声明索引变量:importstd.typecons:ttuple;autoarr[t(1,2),t(3,4)];//声明数组索引,并解包元组元素foreach(i,(x,y);arr){assert(x2*i1y2*i2);}importstd.range;//解包嵌套元组区间foreach(i,(j,k);enumerate(arr)){writeln(i, ,j, ,k);//0 1 2\n1 3 4\n}在迭代关联数组时,也可解包索引变量:autoaa[t(1,2):hi,t(3,4):bye];foreach((a,b),s;aa)writeln(a,b,s);//12hi\n34bye\n最后,也支持静每一及带opApply的struct/class.更多这删除了使用pair[0]或传统的foreach(id,label;pairs)语法,后者偶尔会出现复杂类型的边角例.它稳定,可预测,很好用.4.解包函数字面参数这正是功能真正强大的地方.DIP1053支持解包函数参数和闭包字面:alias dg((x,y),z)writeln(x, ,y, ,z);dg(tuple(1,2),3);//123\n((x,y),z){...}降级为(__arg0,z){auto(x,y)__arg0;...}.一般,它会保留并复制参数的存储类到函数体中的解包声明.importstd.algorithm;[t(1,2),t(2,3)].map!(((a,b))ab).each!writeln;//3\n5\nautoarr[t(1,2),t(3,4)];arr.each!(((ref x,y)){x3*y;});assert(arr.all!((const(x,y))x3*y));由于技术原因,普通函数还不支持该解包…至少现在还没有.希望未来的DIP可扩展内置元组语法.借助它,得到了更快,更安全的代码,结合了本地编译的速度和脚本语言的高效.

更多文章