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 foreachmixin 也是可能的)。

主要是根据偏好选择一个,一些编码器可能永远不会使用元组和其他大部分时间。

它们通常有不同的用例。

主要区别在于 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

没有硬性规定您想要/适合的类型强度。