Отдельный тип представляют структуры-кортежи (tuple structs). Как и структуры они определяются с помощью ключевого слова struct, но для их полей не указываются имена - только типы данных:
struct название_структуры
{
тип_поля1,
тип_поля2,
....
тип_поляN
}
Например:
fn main(){
let start = Point(2, 4);
let end = Point(2, 7);
println!("Начало: (x={}, y={})", start.0, start.1);
println!("Конец: (x={}, y={})", end.0, end.1);
}
struct Point(i32, i32);
В данном случае определена структура Point, которая представляет условную точку на плоскости и состоит из двух координат - двух полей
типа i32.
struct Point(i32, i32);
При инициализации переменной структуры ее полям передаются некоторые значения, которые соответствуют типу полей:
let start = Point(2, 4);
Для обращения к полям такой структуры применяется тот же подход, что и в кортежах - обращение идет по индексу полей. То есть для обращения к первому полю применяется индекс 0
start.0
Для обращения ко второму полю применяется индекс 1 и так далее
start.1
Консольный вывод программы:
Начало: (x=2, y=4) Конец: (x=2, y=7)
Могут быть и более сложные конструкции, когда одна структура-кортеж использует другие:
fn main(){
let start = Point(2, 4);
let end = Point(2, 7);
let dist = Distance(start, end);
println!("Начало: ({},{})", dist.0.0, dist.0.1);
println!("Конец: ({},{})", dist.1.0, dist.1.1);
}
struct Point(i32, i32);
struct Distance(Point, Point);
Результат работы:
Начало: (2, 4) Конец: (2, 7)
Здесь структура-кортеж Distance использует другую структуру-кортеж Point. Соответственно чтобы обратитьсяк полям структуры Point внутри структры Distance, необходимо использовать два индекса:
dist.0.0
dist.0 указывает на первое поле структуры Distance, а dist.0.0 на первое поле стуктуры Point, которая представляет первое поле структуры Distance.