【问题标题】:Cannot move out of captured variable in an `Fn` closure无法在“Fn”闭包中移出捕获的变量
【发布时间】:2020-01-16 00:51:11
【问题描述】:

我对 rust-lang 非常陌生。我正在尝试创建我的第一个程序,但我只是迷失了 rust-lang 的所有权/借用。

这是我的代码:

let core: PackageCore = package_core::init();
let html = include_str!("./html/index.html");

rouille::start_server("0.0.0.0:44", move |request| {
    core.send_command();
    return Response::html(html.clone());
});

core.start();

这是我的错误:

可能有人可以在这里帮助我:)

干杯

【问题讨论】:

    标签: rust


    【解决方案1】:

    我已经指出问题出在你的 sn-p 上:

    let core: PackageCore = package_core::init();
    let html = include_str!("./html/index.html");
    
    rouille::start_server("0.0.0.0:44", move |request| {
        core.send_command(); // <-- this is where you moved
        return Response::html(html.clone());
    });
    
    core.start(); // <-- but you need it here outside of the closure
    

    你 move core 在闭包内,然后你在它外面调用 start()。那是不可能的;它要么移到内部,要么移到外部。为了绕过它,您可以将它包装在一个允许多个指向它的指针存在的结构中(Arc 或 Rc 是主要候选者),如果我是对的并且start() 需要&amp;mut self,您将需要一个保证内部可变性的结构(Mutex、RwLock 或 RefCell 是一些候选对象)以允许您临时获得对其的可变引用。

    【讨论】:

    • 我需要知道您的PackageCore,尤其是start() 或send_command() fns 是否真的需要可变性
    • 开始需要 mut 并且应该可以颠倒顺序:)
    • 然后,如果您颠倒调用顺序(即start 在listen 之前),您将能够直接进入move 核心,假设在其他任何地方都没有对core 的悬空引用没有其他需要改变的:-)
    • 其实我有这个:let _ = core.thread.unwrap().join(); 在脚本的最底部。
    猜你喜欢
    • 2016-02-13
    • 2019-04-01
    • 2016-12-24
    • 2015-08-14
    • 1970-01-01
    • 2022-11-19
    • 2015-04-15
    • 2016-01-28
    相关资源
    最近更新 更多