vec!のpop()戻りはOption(@Rust)

以下のコードがBeginning Rustに出てきますが、: Option<i32>はOption<T>の説明上出て来るだけで、コンパイラが型を推測できるからなくても良い。

Option<T>の説明だからあえて冗長に指定しているだけで、実際のコードで記述することはないだろう。

fn main() {

    let mut v = vec![11, 22, 33];
    for _ in 0..5 {
        let item: Option<i32> = v.pop();
        match item {
            Some(number) => print!("{}, ", number),
            None => print!("#, "),
        }
    }
}

vec!のpop()戻りは、以下のドキュメントにある通りOption<T>になります。

https://doc.rust-lang.org/std/vec/struct.Vec.html#method.pop

i32は明示的な指定ですが、ここはベクターの要素を満足できる型ならばu32でもu8でも良い。コンパイラは最適化をするだろうから、内部的にはu8で扱っているはず、と思ったチェックしてみたら実はi32でした。64bitマシン(MacBook M1 Air)であればu8よりもi32の方が効率的なのかも知れないね。

fn main() {
    let mut v = vec![11, 22, 33];
    for _ in 0..5 {
        let item = v.pop();
        p_typename(item);
        match item {
            Some(number) => print!("{}, ", number),
            None => print!("#, "),
        }
    }

    fn p_typename<T>(_: T) {
        println!("{}", std::any::type_name::<T>());
    }
    
}

で実行すると、

core::option::Option<i32>

と返ってきたから、

 

admin

カテゴリーRust