В этой статье мы рассмотрим коллекции и дженерики Rust, две важные функции для написания эффективного и многоразового кода. Мы начнем с базовых примеров и постепенно перейдем к более продвинутым сценариям использования, чтобы помочь вам освоить эти мощные концепции.
Коллекции в Rust
Rust предоставляет несколько типов коллекций для хранения и организации данных, в том числе:
- Векторы: массивы с возможностью изменения размера, в которых хранятся элементы одного типа.
- Строки: текст в кодировке UTF-8.
- ХешКарты: пары «ключ-значение» для эффективного поиска данных.
Векторы
Векторы в Rust аналогичны динамическим массивам или ArrayList на других языках. Они могут расти или уменьшаться в размере и хранить элементы одного типа.
// Создание пустого вектора
let mut numbers: Vec<i32> = Vec::new();
// Добавление элементов к вектору
numbers.push(1);
numbers.push(2);
numbers.push(3);
// Доступ к элементам с помощью индекса
println!("First element: {}", numbers[0]);
Строки
В Rust строки кодируются UTF-8 и могут быть созданы с помощью String или &str.
// Создание строки из строкового литерала
let s: String = String::from("hello");
// Конкатенация строк
let mut s1 = String::from("hello");
let s2 = " world";
s1.push_str(s2);
println!("{}", s1);
Хеш-карты
Хеш-карта хранит пары ключ-значение и обеспечивает быстрый поиск на основе ключей.
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
let score = scores.get(&team_name);
println!("Score: {:?}", score);
Дженерики в Rust
Дженерики позволяют создавать функции и типы данных, которые могут работать с несколькими типами, что приводит к более многоразовому и эффективному кодированию.
Дженерики в функциях
В Rust можно использовать дженерики для создания функций, работающих с различными типами.
fn identity<T>(value: T) -> T {
value
}
let a = identity(42);
let b = identity(3.14);
Дженерики в структурах
Можно также создать общие структуры для хранения значений различных типов.
struct Point<T> {
x: T,
y: T,
}
let int_point = Point { x: 1, y: 2 };
let float_point = Point { x: 1.0, y: 2.0 };