Rust 的閉包實現(xiàn)與其它語言有些許不同。它們實際上是trait的語法糖。在這以前你會希望閱讀trait章節(jié),和trait對象。
都理解嗎?很好。
理解閉包底層是如何工作的關(guān)鍵有點奇怪:使用()
調(diào)用函數(shù),像foo()
,是一個可重載的運(yùn)算符。到此,其它的一切都會明了。在Rust中,我們使用trait系統(tǒng)來重載運(yùn)算符。調(diào)用函數(shù)也不例外。我們有三個trait來分別重載:
# mod foo {
pub trait Fn<Args> : FnMut<Args> {
extern "rust-call" fn call(&self, args: Args) -> Self::Output;
}
pub trait FnMut<Args> : FnOnce<Args> {
extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
}
pub trait FnOnce<Args> {
type Output;
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}
# }
你會注意到這些 trait 之間的些許區(qū)別,不過一個大的區(qū)別是self
:Fn
獲取&self
,FnMut
獲取&mut self
,而FnOnce
獲取self
。這包含了所有3種通過通常函數(shù)調(diào)用語法的self
。不過我們將它們分在 3 個 trait 里,而不是單獨(dú)的 1 個。這給了我們大量的對于我們可以使用哪種閉包的控制。
閉包的|| {}
語法是上面 3 個 trait 的語法糖。Rust 將會為了環(huán)境創(chuàng)建一個結(jié)構(gòu)體,impl
合適的 trait,并使用它。
這部分引用自The Rust Programming Language中文版