以下のコードが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