在 Rust 中,為什麼 FNonce 可以改變值?

https://stackoverflow.com/questions/77934563/in-rust-why-can-fnonce-mutate-values

在 Rust 中,為什麼 FnOnce 可以改變值?

我一直認為 FnOnce 是在其作用域中能夠消耗值的函數,但無法改變值,那應該使用 FnMut 及 mut 閉包來實現。

然而,這個例子似乎可以運行:

#[derive(Copy, Debug, Clone)]
struct Thing(u8);

fn thing(closure: T) -> Result where T: FnOnce() -> Result {
closure()
}

fn main() {
let mut a = None;
let b = || {
a = Some(Thing(8));
a.ok_or_else(|| panic!(“yo”))
};
let c = thing(b).unwrap();
println!(“{a:?}”);
println!(“{c:?}”);
}

並輸出:

Some(Thing(8))
Thing(8)

非 mut 閉包可以在其環境中修改可變變量,只要將它轉換為 FnOnce 並只使用一次。為什麼 Rust 在這裡沒有強制使用 FnMut 和可變閉包呢?我感到困惑。

via Recent Questions – Stack Overflow

February 4, 2024 at 12:00PM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *