Structure 和 Tuple 的原理区别是什么?
What principle difference between Structure and Tuple?
writeln(is(Tuple!(string, int) == struct)); // true
当我应该使用 Tuple
而不是 struct
时,真实的用户案例是什么?
Tuple
主要是为了方便,因为编写 tuple(0, "bar")
通常比定义结构更短。
在一些用例中元组很方便,例如展开为 AliasSeq
:
import std.typecons : tuple;
void bar(int i, string s) {}
void main()
{
auto t = tuple(1, "s");
bar(t.expand);
}
expand
在处理范围时也很方便:
void main()
{
import std.stdio : writeln;
import std.typecons : tuple;
auto ts = tuple(1, "s");
foreach (t; ts)
{
t.writeln;
}
import std.algorithm : minElement;
import std.range;
tuple(2, 1, 3).expand.only.minElement.writeln; // 1
}
另一种 real-use 情况是 zip
,其中 zip([0], ["s"])
的结果是 Tuple!(int, string)
(或通常 staticMap!(ElementType, Args)
),这比生成结构更容易动态地(当然 static foreach
或 mixin
也是可能的)。
主要是根据偏好选择一个,一些编码器可能永远不会使用元组和其他大部分时间。
它们通常有不同的用例。
主要区别在于 Tuple 由其中的类型输入(named/identified 由编译器),而 Struct 由编码器选择的标签输入。即,如果函数 returns Tuple!(string,int)
和另一个函数 returns 字符串和 int 元组将返回相同的类型;但是如果一个函数 returns 一个包含字符串和 int (struct Struct{string s; int i;}
) 的结构(例如 Struct fun(arg)
),它可能会返回一个与 returns 不同的函数不同的类型具有相同类型的结构。
本质上相同的差异和编码人员为 Vector 或 Position 选择结构或数组的原因(struct Pos {int x; int y;}
vs int[2]
)
Tuple!(string,int) == Tuple!(string,int)
StructA != StructB
没有硬性规定您想要/适合的类型强度。
writeln(is(Tuple!(string, int) == struct)); // true
当我应该使用 Tuple
而不是 struct
时,真实的用户案例是什么?
Tuple
主要是为了方便,因为编写 tuple(0, "bar")
通常比定义结构更短。
在一些用例中元组很方便,例如展开为 AliasSeq
:
import std.typecons : tuple;
void bar(int i, string s) {}
void main()
{
auto t = tuple(1, "s");
bar(t.expand);
}
expand
在处理范围时也很方便:
void main()
{
import std.stdio : writeln;
import std.typecons : tuple;
auto ts = tuple(1, "s");
foreach (t; ts)
{
t.writeln;
}
import std.algorithm : minElement;
import std.range;
tuple(2, 1, 3).expand.only.minElement.writeln; // 1
}
另一种 real-use 情况是 zip
,其中 zip([0], ["s"])
的结果是 Tuple!(int, string)
(或通常 staticMap!(ElementType, Args)
),这比生成结构更容易动态地(当然 static foreach
或 mixin
也是可能的)。
主要是根据偏好选择一个,一些编码器可能永远不会使用元组和其他大部分时间。
它们通常有不同的用例。
主要区别在于 Tuple 由其中的类型输入(named/identified 由编译器),而 Struct 由编码器选择的标签输入。即,如果函数 returns Tuple!(string,int)
和另一个函数 returns 字符串和 int 元组将返回相同的类型;但是如果一个函数 returns 一个包含字符串和 int (struct Struct{string s; int i;}
) 的结构(例如 Struct fun(arg)
),它可能会返回一个与 returns 不同的函数不同的类型具有相同类型的结构。
本质上相同的差异和编码人员为 Vector 或 Position 选择结构或数组的原因(struct Pos {int x; int y;}
vs int[2]
)
Tuple!(string,int) == Tuple!(string,int)
StructA != StructB
没有硬性规定您想要/适合的类型强度。