From Conversion

From

From trait объясняет, как провести конверсию из типа A в тип B:

// Возьмём 2 типа - банан и смузи:
struct Banana {
    ripeness: u8,
}

struct Smoothie {
    flavor: String,
}

// Сообщаем как превратить банан в смузи:
impl From<Banana> for Smoothie {
    fn from(banana: Banana) -> Self {
        Smoothie {
            flavor: format!("banana ripeness level {}", banana.ripeness),
        }
    }
}

// Получаем:
let my_banana = Banana { ripeness: 8 };
let my_smoothie: Smoothie = my_banana.into();  // авто конвертация!
// ИЛИ
let my_smoothie = Smoothie::from(my_banana);    // явная конвертация!

Встроенные конверсии

String

let my_string: String = "hello".into();  // &str → String
let owned_string = String::from("hello");

File Paths

use std::path::PathBuf;
let path: PathBuf = "/home/user/docs".into();  // &str → PathBuf

Errors

// Converting different errors into one type
impl From<NetworkError> for AppError {
    fn from(error: NetworkError) -> Self {
        AppError::Network(error.to_string())
    }
}

// Now functions can use ? operator automatically:
fn do_stuff() -> Result<(), AppError> {
    let data = connect_to_server()?;  // NetworkError automatically becomes AppError!
    Ok(())
}