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(())
}