文字列のパース
Unicode 書記素を収集する
unicode-segmentation クレートの
UnicodeSegmentation::graphemes 関数を使用して、UTF-8 文字列から個々の
Unicode 書記素を収集します。
use unicode_segmentation::UnicodeSegmentation;
fn main() {
let name = "José Guimarães\r\n";
let graphemes = UnicodeSegmentation::graphemes(name, true)
.collect::<Vec<&str>>();
assert_eq!(graphemes[3], "é");
}
カスタム struct に FromStr トレイトを実装する
カスタム構造体 RGB を作成し、FromStr トレイトを実装して、指定されたカラーの16進コードを RGB カラーコードに変換します。
use std::str::FromStr;
#[derive(Debug, PartialEq)]
struct RGB {
r: u8,
g: u8,
b: u8,
}
impl FromStr for RGB {
type Err = std::num::ParseIntError;
// '#rRgGbB..' 形式のカラー16進コードを
// 'RGB' のインスタンスにパースする
fn from_str(hex_code: &str) -> Result<Self, Self::Err> {
// u8::from_str_radix(src: &str, radix: u32) は、指定された基数の文字列
// スライスを u8 に変換する
let r: u8 = u8::from_str_radix(&hex_code[1..3], 16)?;
let g: u8 = u8::from_str_radix(&hex_code[3..5], 16)?;
let b: u8 = u8::from_str_radix(&hex_code[5..7], 16)?;
Ok(RGB { r, g, b })
}
}
fn main() {
let code: &str = &r"#fa7268";
match RGB::from_str(code) {
Ok(rgb) => {
println!(
r"RGB カラーコード: R: {} G: {} B: {}",
rgb.r, rgb.g, rgb.b
);
}
Err(_) => {
println!("{} は有効なカラー16進コードではありません!", code);
}
}
// from_str が期待どおりに動作するかをテストする
assert_eq!(
RGB::from_str(&r"#fa7268").unwrap(),
RGB {
r: 250,
g: 114,
b: 104
}
);
}