型別推斷
Rust 會觀察變數的「使用」方式,藉此判斷型別:
fn takes_u32(x: u32) { println!("u32: {x}"); } fn takes_i8(y: i8) { println!("i8: {y}"); } fn main() { let x = 10; let y = 20; takes_u32(x); takes_i8(y); // takes_u32(y); }
這張投影片展示了 Rust 編譯器如何根據變數宣告和用法設下的限制來推斷型別。
請務必強調,以這種方式宣告的變數,並非「任一型別」這類可存放任何資料的動態型別。此類宣告產生的機器碼與型別的明確宣告相同。編譯器會替我們執行工作,並協助編寫更精簡的程式碼。
以下程式碼會指示編譯器使用 _
做為預留位置,進而複製到特定泛型容器中,而無須明確指出包含的型別:
fn main() { let mut v = Vec::new(); v.push((10, false)); v.push((20, true)); println!("v: {v:?}"); let vv = v.iter().collect::<std::collections::HashSet<_>>(); println!("vv: {vv:?}"); }
collect
relies on FromIterator
, which HashSet
implements.