【问题标题】:What is the syntax: `instance.method::<SomeThing>()`?语法是什么:`instance.method::<SomeThing>()`?
【发布时间】:2019-02-20 22:46:14
【问题描述】:

我从byteorder 阅读了以下语法:

rdr.read_u16::<BigEndian>()

我找不到任何解释语法 instance.method::&lt;SomeThing&gt;() 的文档

【问题讨论】:

标签: rust


【解决方案1】:

这种结构被称为涡轮鱼。如果你搜索这个语句,你会发现它的定义和用法。

虽然Rust Programming Language第一版已经过时了,但我觉得this particular sectionsecond book要好。

引用第二版:

path::&lt;...&gt;, method::&lt;...&gt;
为表达式中的泛型类型、函数或方法指定参数;通常称为turbofish(例如"42".parse::&lt;i32&gt;()

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

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&lt;i32&gt; 而不是 Vec::&lt;i32&gt;(类型的语法中不存在小于和大于)。
  • 为了解决 starblue 提到的语法歧义(和 some are still ongoing)已经进行了多次尝试,因此您有可能有一天可以不使用 ::。这是一个trickier problem,但乍一看可能不是这样:)
  • 我更喜欢c,因为它更短
  • bc 本质上都不比另一个好。每个都有时间,他们是有用的,更简洁。两者都同样地道。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
相关资源
最近更新 更多