Rust中Turbofish之函式後面雙冒號(::)用法

rayylee發表於2020-12-08

RUST中的語法,Turbofish通常用於在表示式中為泛型型別、函式或方法指定引數。

1. Turbofish語法

大部分時候當涉及到泛型時,編譯器可以自動推斷出泛型引數:

// v must be a Vec<T> but we don't know what T is yet
let mut v = Vec::new();
// v just got a bool value, so T must be bool!
v.push(true);
// Debug-print v
println!("{:?}", v);

但是有的時候,編譯器需要一些幫助。例如,如下如果省略最後一行的列印,會得到一個編譯錯誤:

let v = Vec::new();
//      ^^^^^^^^ cannot infer type for `T`
//
// note: type annotations or generic parameter binding required
println!("{:?}", v);

我們要麼可以使用一個型別註解來解決它:

let v: Vec<bool> = Vec::new();
println!("{:?}", v);

要麼通過一個叫做turbofish(::<>) 的語法來繫結泛型引數T:

let v = Vec::<bool>::new();
println!("{:?}", v);

2. 使用方法

需要為泛型函式,方法,結構或列舉指定具體型別的情況。
在型別定義中使用IDENT,而在表示式上下文中使用IDENT::來指定泛型引數的型別。

標準庫裡面的std::mem::size_of()函式使用方法如下:

pub const fn size_of<T>() -> usize

使用方法如下:

std::mem::size_of::<u8>(); //u8的位元組數
std::mem::size_of::<u32>(); //u32的位元組數
std::mem::size_of::<i32>(); //i32的位元組數

參考:
The Rust Programming Language
Where to put the turbofish
RUST中的turbofish語法

相關文章