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
- 相关文章链接