文字列への変換と文字列からの変換
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()); }
文字列のパース
文字列を多くの型に変換できると便利ですが、より一般的な文字列操作の 1 つは、 文字列から数値に変換することです。これに対する慣用的なアプローチは、 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); }