turbofish-涡轮鱼,通常用于在表达式中为泛型类型、函数或方法指定参数。关于turbofish,在《Rust 程序设计语言(第一版)》和《Rust 程序设计语言(第二版)》都有说明,个人觉得第一版说得比较清楚。
- 《Rust 程序设计语言(第一版)》中的泛型章节
大部分时候当涉及到泛型时,编译器可以自动推断出泛型参数:
// 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’ ::<> 的语法来绑定泛型参数T:
let v = Vec::<bool>::new();
println!("{:?}", v);
第二种方法在我们并不想要将结果绑定到一个变量时很有用。它也可以用来在函数和方法中绑定泛型参数。查看迭代器与消费者 章节来获取一个例子。
- 《Rust 程序设计语言(第二版)》中的运算符与语法章节
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>()) |
你可以在编译器无法推断类型参数的任何情况下使用它,例如:
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语法指定类型参数。
c是可行的,因为我们直接指定了c的类型。
- 相关文章链接
网友评论