В книге 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 есть больше информации о новых типах.