Skip to content

Latest commit

 

History

History
110 lines (86 loc) · 4.64 KB

ch-09-tupes_structs.md

File metadata and controls

110 lines (86 loc) · 4.64 KB

Кортежи и структуры

Кортежи

Кортежи помогают объединить в один набор значения разных типов. Они очень похожи на массивы за исключением некоторой отличии формы и состава содержания. Массивы в отличии от кортежей не могут содержать в себе данных разных типов. Примеры объявления и вывода на консоль содержания кортежей:

fn main() {
    let data = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
    let copy_of_data = data;
    print!("{}, {}, {}, {}, {:?}", data.0, copy_of_data.1, data.3,data.4,data.5);
}

Rust Playground

Указания типа данных кортежа явным образом:

fn main() {
    let data: (u32, f32, char, char, &'static str, ()) = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
    let copy_of_data = data;
    print!(
        "{}, {}, {}, {}, {:?}",
        data.0, copy_of_data.1, data.3, data.4, data.5
    );
}

Rust Playground

Также как и массивы (и другие переменные) кортеж для изменений должен содержать в своём объявлении ключевое слово `mut':

fn main() {
    let mut data: (u32, f32, char, char, &'static str, ()) = (10_000_000, 183.19, 'й', 'Q', "Hello, Rust!", ());
    
    data.0  = 1;
    data.1  = 1.1;
    data.2  = 'j';
    print!(
        "{}, {}, {}, {}, {}, {:?}",
        data.0, data.1,data.2, data.3, data.4, data.5
    );
}

Rust Playground

Важным отличием кортежа от массива является то, что получить доступ по индексу, значение которой находится в переменной он не может.

fn main() {
    let array: [u16; 3] = [152, 133, 146];
    let _tuple: (u8, u16, u16) = (16, 153, 214);
    let i = 0;
    print!("{}", array[i]);
    //print!("{}", _tuple.i);
}

Rust Playground

Структура

Структурой является более сложная форма группировки значений разного типа. Каждому элементу структуры присваивается имя. Благодаря этого элементы структуры легче объявить, получить доступ. Пример объявления и инициализации структуры:

#[derive(Debug)]
struct Data {
    id: u16,
    text: &'static str,
    prefix: char,
}
fn main() {
    let data = Data {
        id: 405,
        text: "info",
        prefix: 'G',
    };

    print!("{:?}", data);
}

Rust Playground

Кортеж-Структура

В том случае если состав кортежа необходимо объявить заранее, тогда используют кортеж-структуру:

#[derive(Debug)]
struct Data(u16, &'static str, char, [i32; 5]);
fn main() {
    let data = Data(405, "info", 'G', [4555, 2334343, 65565]);

    println!("{:?}", data);
}

Rust Playground

Домашнее задание

Найдите как можно больше отличий кортежей от массивов. Подумайте, как можно получить доступ к элементу кортежа, как перебрать содержание элементов с помощью циклов, как использовать содержание кортежей в логических операциях.

От простого хранения данных нет особого смысла, если нет возможности удобного к ним доступа. Как это сделать вы узнаете при дальнейшем изучении возможностей стандартной библиотеки Rust.