writeln(is(Tuple!(string, int) == struct)); // true
当我应该使用Tuple
代替struct
?
答案 0 :(得分:6)
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
}
另一个实际用例是zip
,其中zip([0], ["s"])
的结果是Tuple!(int, string)
(或一般staticMap!(ElementType, Args)
),这比动态生成结构更容易(尽管当然也可以使用static foreach
或mixin
。
答案 1 :(得分:3)
很大程度上选择一个是基于偏好,一些编码器可能永远不会使用元组和其他大部分时间。
他们通常有不同的用例。
主要区别在于元组的类型(由编译器命名/标识)由类型组成,而结构由编码器选择的标签键入。即如果函数返回<SafeAreaView>
... your content ...
</SafeAreaView>
而另一个函数返回一个字符串,则int元组将返回相同的类型;但是如果一个函数返回一个包含字符串和int(Tuple!(string,int)
)的结构(例如Struct fun(arg)
),它可以返回一个不同于另一个函数的类型,该函数返回一个具有相同类型的不同结构。
基本上相同的差异和原因,编码人员会为矢量或位置选择结构或数组(struct Struct{string s; int i;}
vs struct Pos {int x; int y;}
)
int[2]
Tuple!(string,int) == Tuple!(string,int)
没有严格的规则只是你想要/有多强烈打字。