rust learning path

мои личные заметки и решения базовых задач из rustlings.

1. переменные: мутабельность

// ошибка: cannot assign twice to immutable variable
// решение: добавить ключевое слово mut
fn main() {
    let mut x = 5;
    x = 6;
}

2. владение: передача строк

// string не реализует copy. передаем по ссылке, чтобы не отдавать владение.
fn main() {
    let s = String::from("hello");
    print_length(&s);
    println!("{}", s); // теперь это работает
}

fn print_length(s: &String) {
    println!("{}", s.len());
}

3. структуры (structs)

// объявление и инстанцирование структуры
struct User {
    username: String,
    active: bool,
}

fn main() {
    let user1 = User {
        username: String::from("admin"),
        active: true,
    };
}

4. перечисления (enums) и pattern matching

enum Coin { Penny, Nickel, Dime, Quarter }

fn value_in_cents(coin: Coin) -> u8 {
    match coin {
        Coin::Penny => 1,
        Coin::Nickel => 5,
        Coin::Dime => 10,
        Coin::Quarter => 25,
    }
}

5. работа с option<t>

// безопасное извлечение значения из option с помощью if let
fn main() {
    let config_max: Option<u8> = Some(3u8);
    
    if let Some(max) = config_max {
        println!("максимум установлен на {}", max);
    }
}

6. обработка ошибок (result)

// использование оператора ? для проброса ошибки
use std::fs::File;
use std::io::{self, Read};

fn read_username() -> Result<String, io::Error> {
    let mut s = String::new();
    File::open("hello.txt")?.read_to_string(&mut s)?;
    Ok(s)
}

7. базовые трейты (traits)

pub trait Summary {
    fn summarize(&self) -> String;
}

struct NewsArticle { headline: String }

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("новость: {}", self.headline)
    }
}