如何在锈(和stdweb)中使用Rc Refcell

问题描述 投票:0回答:1

我对此代码有一点疑问:

我有两个闭包,并且我希望在两个变量中都使用变量counter

fn main() {
    stdweb::initialize();


    let counter_div = document().query_selector(DIV_SELECTOR_NAME).unwrap().unwrap();
    // create Rc RefCell struct here 
    let mut counter = Rc::new(RefCell::new(ClickCounter::new()));

    counter_div.clone().add_event_listener(move |_: MouseDownEvent| {
        // ERROR move How make this work?
        counter.clone().borrow_mut().increment();
    });


    let upgrade_div = document().query_selector(UPGRADE_DIV_SELECTOR_NAME).unwrap().unwrap();
    upgrade_div.clone().add_event_listener( move |_: MouseDownEvent|{

       // ERROR move! 
       counter.clone().borrow_mut().upgrade_click(upgrade);
    });


    stdweb::event_loop();
}
rust
1个回答
0
投票

Rcmove闭包一起使用时,您需要克隆first,然后将变量移到闭包中。使用您编写的代码,您首先要克隆变量after,该变量已移至闭包中,这意味着当第二个闭锁尝试执行此操作时,该变量不可用。

示例:

let counter = Rc::new(RefCell::new(ClickCounter::new()));

{
    // Clone into a new variable outside of the closure.
    let cloned_counter = counter.clone();

    counter_div.add_event_listener(move |_: MouseDownEvent| {
        // Note: We're no longer cloning here.
        cloned_counter.borrow_mut().increment();
    });
}

// ...

{
    // Clone the counter variable on line 1 again.
    let cloned_counter = counter.clone();
    upgrade_div.add_event_listener(move |_: MouseDownEvent| {
        cloned_counter.borrow_mut().upgrade_click(upgrade);
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.