结构和元组有什么主要区别?

时间:2018-03-12 07:28:06

标签: d

writeln(is(Tuple!(string, int) == struct)); // true

当我应该使用Tuple代替struct

时,真实用户的情况是什么?

2 个答案:

答案 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 foreachmixin

答案 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)

没有严格的规则只是你想要/有多强烈打字。