Rust 为什么赢了';我的闭包不包含一个论点吗?

Rust 为什么赢了';我的闭包不包含一个论点吗?,rust,Rust,目前,我正在尝试实现一个闭包,该闭包捕获封闭函数的一个参数: pub struct RegisteredHtmlEvent<'a> { event_target: EventTarget, type_: &'a str, closure: wasm_bindgen::closure::Closure<dyn std::ops::FnMut(Event)> } pub fn add_event_listener_state<'a, T

目前,我正在尝试实现一个闭包,该闭包捕获封闭函数的一个参数:

pub struct RegisteredHtmlEvent<'a> {
    event_target: EventTarget,
    type_: &'a str,
    closure: wasm_bindgen::closure::Closure<dyn std::ops::FnMut(Event)>
}

pub fn add_event_listener_state<'a, T>(&self, type_: &'a str, state: T, listener: Box<dyn Fn(&T, Event) -> ()>) -> Result<RegisteredHtmlEvent<'a>, JsValue> {
    let closure = Closure::wrap(Box::new(move |event| listener(&state, event)) as Box<dyn FnMut(Event)>);

    match self.event_target.add_event_listener_with_callback(type_, closure.as_ref().unchecked_ref()) {
        Err(e) => Err(e),
        _ => {
            Ok(RegisteredHtmlEvent {
                event_target: self.event_target.clone(),
                type_,
                closure: closure
            })
        }
    }
}

pub-struct-RegisteredHtmlEvent)->Result(&self,type:&'a-str,state:T,listener:Box())->Result让闭包使用
state
而不是
和state
。写
&state
借用了它并引入了一个生命周期,而
state
转移了所有权,并且没有你必须面对的生命周期。

看起来这对我来说是一个愚蠢的错误

我需要这样声明:pub fn add_event_listener_state

以下是更新的方法定义:

pub fn add_event_listener_state<'a, T: 'static>(&self, type_: &'a str, state: T, listener: Box<dyn Fn(&T, Event) -> ()>) -> Result<RegisteredHtmlEvent<'a>, JsValue> {

pub fn add\u event\u listener\u state(&self,type:&'a str,state:T,listener:Box()>)->结果幸运的是,这不起作用。这不是一次。当我听从你的建议时,错误是相当隐晦的。(太大了,不能在这里发布。)我想做的基本上是订阅一个活动,就像我们在C#中做的那样,或者在Mac/iOS上使用GCD。在本例中,我试图封装在wasm中订阅DOM事件所需的所有语法糖;无需恢复到静态防锈功能。(这是一个学习项目,不是发布代码。)state.clone()怎么样?state.clone()是我尝试的第一件事。(如果它起作用的话,我就不会发布这样的问题了!)我怀疑我碰到了某种锈迹斑斑的情况,甚至是一个编译器错误。如果我将state和listener封装到一个装箱结构中(以便闭包的内存大小相同),我将开始得到生存期错误。我认为这无关紧要,因为闭包拥有一切?找到了克隆()无法工作的原因。看起来这是wasm_bindgen的一个限制。不过我不确定这是否能解决这个问题。移动到闭包中的值应具有
静态
生存期。瞧,如果你没有任何推荐人,你会没事的。为什么克隆()不起作用?克隆()不起作用的事实让我感到惊讶。老实说,我是个铁石心肠的新手,我无法详细解释原因。实际情况是,如果我使用“state:&'static T”,调用方会出现问题,因为其状态值是瞬态的。(非静态)错误消息不会告诉您尝试
和'static t
,它会告诉您尝试
t:'static
。我在问题注释中链接的问答解释了它们为什么不同(以及为什么
T:
&static T
不适用时,
&static T
可能会起作用)。@trentcl:我希望你能在这个帖子中给出答案,我会给你一个奖励!很高兴我能帮忙!我很满意将这个问题标记为另一个问题的副本,因为这将引导未来的提问者找到相关答案。将状态参数设置为“static”会导致调用者出现问题,因为状态是瞬态的-
T:“static
并不意味着
状态必须是静态的,它只是意味着
T
不能包含任何非
静态的
引用。我不知道这里的情况是否如此,因为我不知道所涉及的类型和函数的定义。如果这样做有效的话,这个问题将是一个重复的问题
pub fn add_event_listener_state<'a, T: 'static>(&self, type_: &'a str, state: T, listener: Box<dyn Fn(&T, Event) -> ()>) -> Result<RegisteredHtmlEvent<'a>, JsValue> {