【发布时间】:2019-02-20 22:46:14
【问题描述】:
我从byteorder 阅读了以下语法:
rdr.read_u16::<BigEndian>()
我找不到任何解释语法 instance.method::<SomeThing>() 的文档
【问题讨论】:
-
有关此语法的最重要链接:turbo.fish
标签: rust
我从byteorder 阅读了以下语法:
rdr.read_u16::<BigEndian>()
我找不到任何解释语法 instance.method::<SomeThing>() 的文档
【问题讨论】:
标签: rust
这种结构被称为涡轮鱼。如果你搜索这个语句,你会发现它的定义和用法。
虽然Rust Programming Language第一版已经过时了,但我觉得this particular section比second book要好。
引用第二版:
path::<...>,method::<...>
为表达式中的泛型类型、函数或方法指定参数;通常称为turbofish(例如"42".parse::<i32>())
您可以在编译器无法推断类型参数的任何情况下使用它,例如
fn main () {
let a = (0..255).sum();
let b = (0..255).sum::<u32>();
let c: u32 = (0..255).sum();
}
a 不起作用,因为它无法推断变量类型。b 起作用,因为我们直接使用 turbofish 语法指定类型参数。c 起作用,因为我们指定了类型的c 直接。
【讨论】:
:: 的原因是它避免了小于和大于运算符的语法歧义。这与类型不同,类型是 Vec<i32> 而不是 Vec::<i32>(类型的语法中不存在小于和大于)。
::。这是一个trickier problem,但乍一看可能不是这样:)
c,因为它更短
b 和 c 本质上都不比另一个好。每个都有时间,他们是有用的,更简洁。两者都同样地道。