美文网首页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