语法是什么:`instance.method :: <SomeThing>()`?

周汉成*_*周汉成 5 rust

我从byteorder读取了以下语法:

rdr.read_u16::<BigEndian>()
Run Code Online (Sandbox Code Playgroud)

我找不到任何解释语法的文档 instance.method::<SomeThing>()

hel*_*low 15

这种结构称为涡轮机.如果搜索此语句,您将发现其定义及其用法.

虽然第一版The Rust Programming Language已经过时,但我觉得这个特别的部分第二本书更好.

引用第二版:

path::<...>,method::<...>
指定表达式中泛型类型,函数或方法的参数; 通常被称为涡轮风险(例如"42".parse::<i32>())

您可以在编译器无法推断出类型参数的任何情况下使用它,例如

fn main () {
    let a = (0..255).sum();
    let b = (0..255).sum::<u32>();
    let c: u32 = (0..255).sum();
}
Run Code Online (Sandbox Code Playgroud)

a不起作用,因为它不能推断出变量类型.
b确实有效,因为我们直接使用turbofish语法指定了type参数.
c确实有效,因为我们c直接指定了类型.

  • 已经有几次尝试来解决starblue提到的语法模糊性(以及[有些仍在进行中](https://github.com/varkor/rfcs/pull/1)),所以你可能会离开`有一天,`` 这是一个[棘手的问题](https://github.com/rust-lang/rust/pull/53562)乍看之下,虽然:) (4认同)
  • 表达式中需要`::`的原因是它避免了使用小于和大于运算符的语法歧义.这与类型不同,在这些类型中,您编写`Vec <i32>`而不是`Vec :: <i32>`(小于和大于类型的语法中不存在). (2认同)