До та з рядків (Strings)
Перетворення в String
Щоб перетворити будь-який тип на String, достатньо реалізувати трейт ToString
для цього типу. Замість того щоб робити це напряму, слід реалізувати трейт
fmt::Display, який автоматично надає ToString і також дозволяє
виводити тип, як описано в розділі про print!.
use std::fmt;
struct Circle {
radius: i32
}
impl fmt::Display for Circle {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Circle of radius {}", self.radius)
}
}
fn main() {
let circle = Circle { radius: 6 };
println!("{}", circle.to_string());
}
Розбір рядка
Корисно перетворювати рядки на багато типів, але однією з найпоширеніших
операцій над рядками є перетворення їх із рядка на число. Ідіоматичний підхід
до цього — використовувати функцію parse і або покластися на виведення
типу, або вказати тип, у який треба виконати розбір, використовуючи синтаксис
turbofish. Обидва варіанти показано в наведеному нижче прикладі.
Це перетворить рядок на вказаний тип, якщо для цього типу реалізовано трейт
FromStr. Це реалізовано для багатьох типів у стандартній бібліотеці.
fn main() {
let parsed: i32 = "5".parse().unwrap();
let turbo_parsed = "10".parse::<i32>().unwrap();
let sum = parsed + turbo_parsed;
println!("Sum: {:?}", sum);
}
Щоб отримати цю функціональність для типу, визначеного користувачем, просто
реалізуйте трейт FromStr для цього типу.
use std::num::ParseIntError;
use std::str::FromStr;
#[derive(Debug)]
struct Circle {
radius: i32,
}
impl FromStr for Circle {
type Err = ParseIntError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.trim().parse() {
Ok(num) => Ok(Circle{ radius: num }),
Err(e) => Err(e),
}
}
}
fn main() {
let radius = " 3 ";
let circle: Circle = radius.parse().unwrap();
println!("{:?}", circle);
}