d转换元组为数组
假定,std.typecons.Tuple
,可用[tup.expand]
从元组造数组.[valSeq]
搞值序列.
如下搞数组的数组:
auto arrayOfArrays = [ keys, values ];
更通用的:
import std;
//编译慢但是很方便
auto makeTestTuple(int i) {
return tuple!("key", "value")((i * 2).to!string,(double(i) / 10).to!string);
}
void main() {
auto tuples = iota(10)
.map!makeTestTuple
.array;
string[] keys;
string[] values;
writeln("命令式:");
foreach (t; tuples) {
keys ~= t.key;
values ~= t.value;
}
writeln(keys);
writeln(values);
writeln("替代方案:");
keys = tuples.map!(t => t.key).array;
values = tuples.map!(t => t.value).array;
writeln(keys);
writeln(values);
writeln("更通用:");
keys = tuples.memberArray!"key";
values = tuples.memberArray!"value";
writeln(keys);
writeln(values);
}
auto memberArray(string member, T)(T[] tuples) {
return tuples.map!(t => mixin("t." ~ member)).array;
}
第2个程序:
import std;
auto makeTestTuple(int i) {
return tuple!("key", "value", "其他")(
(i * 2).to!string,
(double(i) / 10).to!string,
i * i);
}
mixin template matchingMember(string name, T) {
mixin (T.stringof ~ "[] " ~ name ~ ';');
}
template TupleMemberArrays(T) {
alias types = T.Types;
alias fieldNames = T.fieldNames;
enum memberCount = types.length;
struct TupleMemberArrays {
static foreach (i; 0 .. memberCount) {
mixin matchingMember!(fieldNames[i], types[i]);
}
this(T[] tuples) {
foreach (t; tuples) {
static foreach (i; 0 .. memberCount) {
mixin (format!q{
%s ~= t.%s = t[%s];
}(fieldNames[i], fieldNames[i], i));
}
}
}
}
}
void main() {
auto tuples = iota(10)
.map!makeTestTuple
.array;
alias S = TupleMemberArrays!(ElementType!(typeof(tuples)));
auto s = S(tuples);
writeln(s.key);
writeln(s.value);
writeln(s.其他);
}
第二个程序定义了匹配元组成员
的类型.给定成员名为"key","value"
和"其他"
的元组;及串,串,整类型
;生成类似以下结构
:
struct YourAliasHere {
string[] key;
string[] value;
int[] 其他;
}
限制:该实现使用并非
所有元组都使用的字段名
.但在需要时,可更改为生成field0,field1
等.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现