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

文字列のパース

Unicode 書記素を収集する

unicode-segmentation-badge cat-text-processing-badge

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], "é");
}

カスタム structFromStr トレイトを実装する

std-badge cat-text-processing-badge

カスタム構造体 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
        }
    );
}