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

RUST中的turbofish语法(二)

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

    turbofish-涡轮鱼的使用场景:
    需要为泛型函数,方法,结构或枚举指定具体类型的情况。
    在类型定义中使用IDENT<T>,而在表达式上下文中使用IDENT::<T>来指定泛型参数的类型。

    • 泛型函数

    标准库里面的std::mem::size_of()函数具有以下签名:

    pub const fn size_of<T>() -> usize
    

    使用方法如下:

    std::mem::size_of::<u8>(); //u8的字节数
    std::mem::size_of::<u32>(); //u32的字节数
    std::mem::size_of::<i32>(); //i32的字节数
    
    • 泛型方法

    str的parse()方法也是你看到使用了turbofish语法的少数地方之一。
    它的签名是:

    pub fn parse<F: FromStr>(&self) -> Result<F, F::Err>
    

    我们可以使用turbofish来告诉应该从str解析的类型,如:

    "2048".parse::<u32>()
    

    另一个常见的例子是Iterator上的collect()。
    它的签名是:

    fn collect<B: FromIterator<Self::Item>>(self) -> B where Self: Sized
    

    因为编译器已经知道你正在收集的Self::Item的类型,所以我们通常不需要指定它。相反,我们可以编写_以让编译器自动推断它。例如,从Iterator<Item=u8>收集到Vec<u8>可以写成:

    [1u8, 2, 3, 4].iter().collect::<Vec<_>>()
    
    • 泛型结构

    如果编译器在创建通用结构时无法推断出足够的信息,可以使用turbofish语法来指定。例如,Vec被定义为:

    pub struct Vec <T> {/ *字段省略* /}
    

    使用Vec::new()创建新的Vec时,可以将其写为:

    Vec::<u8>::new()
    

    请注意,我们将turbofish放在Vec之后,而不是new()方法后面。由于泛型是结构,而不是泛型方法。

    • 泛型枚举

    枚举的turbofish语法不同于我们的经验法则。RUST的枚举turbofish限定没有放在枚举类型后面,面是放在枚举变量之后。

    pub enum Result<T, E> {
        Ok(T),
        Err(E),
    }
    

    我们这样使用它

    Result::Ok::<u8, ()>(10)
    Result::Err::<u8, ()>(())
    

    由于turbofish限定没有放在枚举类型后面,面是放在枚举变量之后,实际上我们可以按如下方式编写:

    Ok::<u8, ()>(10)
    Err::<u8, ()>(())
    

    参考:
    https://matematikaadit.github.io/posts/rust-turbofish.html

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

    相关文章

      网友评论

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

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