13

I read the below syntax from byteorder:

rdr.read_u16::<BigEndian>()

I can't find any documentation which explains the syntax instance.method::<SomeThing>()

kmdreko
  • 42,554
  • 6
  • 57
  • 106
周汉成
  • 1,217
  • 2
  • 13
  • 24

1 Answers1

25

This construct is called turbofish. If you search for this statement, you will discover its definition and its usage.

Although the first edition of The Rust Programming Language is outdated, I feel that this particular section is better than in the second book.

Quoting the second edition:

path::<...>, method::<...>
Specifies parameters to generic type, function, or method in an expression; often referred to as turbofish (e.g., "42".parse::<i32>())

You can use it in any kind of situation where the compiler is not able to deduce the type parameter, e.g.

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

a does not work because it cannot deduce the variable type.
b does work because we specify the type parameter directly with the turbofish syntax.
c does work because we specify the type of c directly.

hellow
  • 12,430
  • 7
  • 56
  • 79
  • 7
    The reason that `::` is required in expressions is that it avoids a syntax ambiguity with the less-than and greater-than operators. This is different from types, where you write `Vec` and not `Vec::` (less-than and greater-than don't exist in the syntax for types). – starblue Sep 17 '18 at 06:52
  • 4
    There's been several attempts to resolve the syntax ambiguity that starblue mentioned (and [some are still ongoing](https://github.com/varkor/rfcs/pull/1)), so it's possible you might be able to leave the `::` out some day. It's a [trickier problem](https://github.com/rust-lang/rust/pull/53562) than it might seem at first glance, though :) – Joe Clay Sep 17 '18 at 08:14
  • I prefere `c` because it's shorter – Tim Diekmann Sep 17 '18 at 12:04
  • 1
    Neither `b` nor `c` are inherently better than the other. Each have times that they are useful and more succinct. Both are equally idiomatic. – Shepmaster Sep 17 '18 at 13:26