Каковы некоторые варианты использования кортежей?

В книге Rust упоминается, что "почти всегда лучше использовать структуру, чем структуру кортежа". Помимо шаблона newtype, есть ли другие преимущества наличия неназванных полей? Мне кажется, что шаблон newtype - единственный полезный случай наличия кортежей.

Ответ 1

Они очень похожи друг на друга.

Учитывая следующие определения

struct TupleStruct(i32, i32);
struct NormalStruct {
    a: i32,
    b: i32,
}

мы можем создавать экземпляры структур и структур кортежей следующим образом

let ts = TupleStruct(1, 2);
let ns = NormalStruct { a: 1, b: 2 };

// AFAIK, this shortcut to initialize the fields of a struct using the values of the fields
// of another struct can't be done using tuple structs.
let ns2 = NormalStruct { a: 5, ..ns };

Назначения работают следующим образом

let TupleStruct(x, y) = ts;
println!("x: {}, y: {}", x, y);

let NormalStruct { a, b } = ns;
println!("a: {}, b: {}", a, b);

Поля структуры кортежа имеют неявные имена (0, 1,...). Следовательно, доступ к полям выполняется следующим образом:

println!("Accessing ns by name - {}{}", ns.a, ns.b);
println!("accessing ts by name - {}{}", ts.0, ts.1);

По крайней мере, для целей документирования, почти всегда яснее назначать явные имена полям структуры. Вот почему в сообществе Rust я видел много аргументов в пользу того, чтобы всегда использовать нормальную структуру.

Однако могут быть случаи, когда поля структуры по сути являются "анонимными", при этом одним заметным случаем является "новый тип" (структура кортежа с одним полем), когда вы переносите только внутренний тип.

В этом случае присвоение имени внутреннему полю не дает никакой дополнительной информации.

struct Inches {
    inner: i32,
}

против

struct Inches(i32);

В разделе о структурах книги Rust есть больше информации о новых типах.