gpt4 book ai didi

Rust 在实现的 Struct 中调用 FnMut

转载 作者:行者123 更新时间:2023-12-04 07:13:10 25 4
gpt4 key购买 nike

我有以下代码片段,它实现了某种发射器结构:

type Callback<'a> = Option<&'a mut dyn FnMut()>;

struct Emitter<'a> {
cb: Callback<'a>
}

impl<'a> Emitter<'a> {

fn emit(&mut self) {
if self.cb.is_some() {
let f = self.cb.unwrap();
f()
}
}
}

fn main() {

let mut cb = || println!("test");

let mut e = Emitter {
cb : Some(&mut cb)
};

e.emit();
}
emit() 函数尝试运行保存的回调 clojure。但是我无法理解如何运行回调,因为代码会产生以下错误:
  --> src/main.rs:11:15
|
11 | let f = self.cb.unwrap();
| ^^^^^^^
| |
| move occurs because `self.cb` has type `Option<&mut dyn FnMut()>`, which does not implement the `Copy` trait
| help: consider borrowing the `Option`'s content: `self.cb.as_ref()`
感谢一些帮助:)
这是replit的片段: https://replit.com/@lutzer/RustEmitterTest

最佳答案

这里发生的事情是你的线路

let f = self.cb.unwrap();
想要将关闭移出 Option枚举。此操作使用该枚举,这对于属于结构的事物是不允许的。
这是一个更简单的示例来说明我的意思:
fn main() {
let an_option = Some(String::from("Woot!");
let the_value = an_option.unwrap();
println!("The value is {}", the_value);

println!("The option is {:?}", an_option); // error here! Can't use an_option any more!!!
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=4a4a3660b68ebada99113db5165b6e76
因此,如果您拥有存储在 Some 中的内容的所有权。 Option 的一部分, 通过 unwrap , 那么整个 Option被搬走。您可以在 unwrap 的签名中看到:
pub const fn unwrap(self) -> T
注意它是怎么说的 self , 而不是 &self&mut self .这意味着,在调用 unwrap 之后,枚举被消耗并且不能再被使用,除非 Some中的值部分可以简单地复制(如果您将我的示例中的 String 替换为整数,它将毫无问题地编译)。
来自 Omer Erden 的评论然后解释了一种解决方法:询问 Option通过 as_mut 为您提供可变引用.
或者直接跳过所有这些并使用 map选项的方法,如果选项是 Some,你可以用它来做一些事情如果它是 None,就什么也不做.

关于Rust 在实现的 Struct 中调用 FnMut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68945983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com