turbofish-渦輪魚,通常用于在表達式中為泛型類型下硕、函數(shù)或方法指定參數(shù)丁逝。關(guān)于turbofish,在《Rust 程序設(shè)計語言(第一版)》和《Rust 程序設(shè)計語言(第二版)》都有說明梭姓,個人覺得第一版說得比較清楚霜幼。
- 《Rust 程序設(shè)計語言(第一版)》中的泛型章節(jié)
大部分時候當(dāng)涉及到泛型時,編譯器可以自動推斷出泛型參數(shù):
// v must be a Vec<T> but we don't know what T is yet
let mut v = Vec::new();
// v just got a bool value, so T must be bool!
v.push(true);
// Debug-print v
println!("{:?}", v);
但是有的時候誉尖,編譯器需要一些幫助罪既。例如,如下如果省略最后一行的打印释牺,會得到一個編譯錯誤:
let v = Vec::new();
// ^^^^^^^^ cannot infer type for `T`
//
// note: type annotations or generic parameter binding required
println!("{:?}", v);
我們要么可以使用一個類型注解來解決它:
let v: Vec<bool> = Vec::new();
println!("{:?}", v);
要么通過一個叫做‘turbofish’ ::<> 的語法來綁定泛型參數(shù)T:
let v = Vec::<bool>::new();
println!("{:?}", v);
第二種方法在我們并不想要將結(jié)果綁定到一個變量時很有用萝衩。它也可以用來在函數(shù)和方法中綁定泛型參數(shù)。查看迭代器與消費者 章節(jié)來獲取一個例子没咙。
- 《Rust 程序設(shè)計語言(第二版)》中的運算符與語法章節(jié)
Table B-4: Generics
Symbol | Explanation |
---|---|
path::<...>, method::<...> | Specifies parameters to generic type, function, or method in an expression; often referred to as turbofish (e.g., "42".parse::<i32>()) |
你可以在編譯器無法推斷類型參數(shù)的任何情況下使用它猩谊,例如:
fn main () {
let a = (0..255).sum(); //error, cannot infer type
let b = (0..255).sum::<u32>();
let c: u32 = (0..255).sum();
}
a不起作用,因為它不能推斷變量類型祭刚。
b確實有效牌捷,因為我們直接用turbofish語法指定類型參數(shù)墙牌。
c是可行的,因為我們直接指定了c的類型暗甥。
- 相關(guān)文章鏈接