What is the syntax: `instance.method::<SomeThing>()`?

  • A+
Category:Languages

I read the below syntax from byteorder:

rdr.read_u16::<BigEndian>() 

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

 


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.

I would always prefer solution b over any other, because it feels more idiomatic Rust, than c (I never specify the variable type, unless I have to (e.g. static or const).

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: