美文网首页RUST
RUST中的turbofish语法(一)

RUST中的turbofish语法(一)

作者: 一代码宗师 | 来源:发表于2019-02-21 15:11 被阅读0次

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);

第二种方法在我们并不想要将结果绑定到一个变量时很有用。它也可以用来在函数和方法中绑定泛型参数。查看迭代器与消费者 章节来获取一个例子。

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的类型。

  • 相关文章链接
  1. RUST中的turbofish语法(一)
  2. RUST中的turbofish语法(二)

相关文章

网友评论

    本文标题:RUST中的turbofish语法(一)

    本文链接:https://www.haomeiwen.com/subject/kknryqtx.html