无法移动 `req`,因为它已被借用。

10

我正在使用 Rust 和 tiny-http 进行编程。我创建了一个函数,用于处理请求的头信息并发送响应:

fn handle_request(req: Request) {
    let headers = req.headers();
    // working with headers
    let res = Response::from_string("hi");
    req.respond(res);
}

它会出现错误:

main.rs:41:5: 41:8 error: cannot move out of `req` because it is borrowed
main.rs:41     req.respond(res);
               ^~~
main.rs:27:19: 27:22 note: borrow of `req` occurs here
main.rs:27     let headers = req.headers();
                             ^~~
error: aborting due to previous error

我有点理解req.headers()接受&self,这样可以借用req并且req.respond()“moves”req,因为它接受self。我不确定我应该在这里做什么,有人可以帮助我理解吗?

3个回答

13
你必须确保在移动值之前,借用必须结束。为了适应你的代码:
fn handle_request(req: Request) {
    {
        let headers = req.headers();
        // working with headers
    }
    let res = Response::from_string("hi");
    req.respond(res);
}

借用只会持续到函数顶部的代码块,所以在代码块结束后,你可以自由地移动“res”。

3
那并没有消除借款,只是降低了价值。 - Steve Klabnik
@SteveKlabnik,文档中的示例drop(mutable_borrow)怎么样? - ArtemGr
这是特定于RefCell的,它执行运行时借用检查而不是编译时。那个例子非常糟糕:( - Steve Klabnik
啊,这个例子符合了我的愿望。现在很有意义了。 - ArtemGr

-1

只需引用req

fn handle_request(req: Request) {
    // add "&" before req
    let headers = &req.headers();
    // working with headers
    let res = Response::from_string("hi");
    req.respond(res);
}

-1

我正在费尽心思,发现你可以将借用的响应转换为拥有的响应。使用 req.headers.to_owned()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接