Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

До та з рядків (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);
}