Rust 入門 簡単な関数を書いてみる(1)

Rust 入門その2

前回、FizzBuzzを書いてとりあえずコンパイルと実行の仕方は判ったので、次ももう少しまともなコードを書いてみることにする。
適当な題材はないかと考えて、以前C#で書いた住所の文字列から都道府県や市区町村を分割するコードがあるので、それをRustで書き直してみる。
想像以上に手間取ったので、とりあえず住所から都道府県を切り出す部分のみ。

やりかたは都道府県の名称を正規表現で切り出すだけなのだが、勝手が判らず簡単そうなトコでも思ったようにいかない。

引っかかったのは以下の箇所。

  • 静的な配列の定義のしかた。
  • タプルの配列から要素を取り出し一つの文字列に連結する方法
  • 正規表現の使い方
  • Stringと&strの違い などなど

関数はRustっぽくResultを返すようにしたけど、単純に都道府県とそれ以降のタプルを返す方が後の処理が単純で良いかもしれない。

extern crate regex;
use regex::Regex;

const PREFECTURES:[(&str, &str); 47] = [
        ("01","北海道"), ("02","青森県"), ("03","岩手県"), ("04","宮城県"), ("05","秋田県"),
        ("06","山形県"), ("07","福島県"), ("08","茨城県"), ("09","栃木県"), ("10","群馬県"),
        ("11","埼玉県"), ("12","千葉県"), ("13","東京都"), ("14","神奈川県"), ("15","新潟県"),
        ("16","富山県"), ("17","石川県"), ("18","福井県"), ("19","山梨県"), ("20","長野県"),
        ("21","岐阜県"), ("22","静岡県"), ("23","愛知県"), ("24","三重県"), ("25","滋賀県"),
        ("26","京都府"), ("27","大阪府"), ("28","兵庫県"), ("29","奈良県"), ("30","和歌山県"),
        ("31","鳥取県"), ("32","島根県"), ("33","岡山県"), ("34","広島県"), ("35","山口県"),
        ("36","徳島県"), ("37","香川県"), ("38","愛媛県"), ("39","高知県"), ("40","福岡県"),
        ("41","佐賀県"), ("42","長崎県"), ("43","熊本県"), ("44","大分県"), ("45","宮崎県"),
        ("46","鹿児島県"), ("47","沖縄県")    
    ];

// 住所から都道府県とそれ以降を分割する
fn get_prefecture(address: &str) -> Result<(String, String), String> {
    let prefectures = PREFECTURES.iter().map(|x| x.1).collect::<Vec<&str>>().join("|");
    let pattern = format!("^({})(.+*)$", prefectures);
    let re = Regex::new(&pattern).unwrap();

    match re.captures(address) {
        Some(m) => Ok(((&m[1]).to_string(), (&m[2]).to_string())),
        None => Err("No match".to_string())
    }
}

// main
fn main() {
    match get_prefecture("大阪府大阪市北区ほげほげ1-2-3") {
        Ok(ret) => println!("{:?}", ret),
        Err(e) => println!("{}", e)
    };
}