字符串的相互转换
转换为字符串
将任何类型转换为 String
类型就像为该类型实现 ToString
trait 一样简单。 您不应该直接这样做,而是应该实现 fmt::Display
trait,它会自动提供 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
函数,并安排类型推断或使用“涡轮鱼”语法指定要解析的类型。 以下示例中显示了两种替代方案。
只要该类型实现了 FromStr
trait,这将把字符串转换为指定的类型。 标准库中为许多类型实现了该 trait。
fn main() { let parsed: i32 = "5".parse().unwrap(); let turbo_parsed = "10".parse::<i32>().unwrap(); let sum = parsed + turbo_parsed; println!("Sum: {:?}", sum); }
要在用户自定义类型上获得此功能,只需为该类型实现 FromStr
trait 即可。
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); }