RUST

RUST中的turbofish语法(二)

2019-02-22  本文已影响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语法(二)
上一篇下一篇

猜你喜欢

热点阅读