rust - 在此语句结束时释放临时值

标签 rust borrow-checker

我正在尝试使用 Select crate 抓取网页:

let document = Document::from_read(response).unwrap();

for node in document.find(Class("lia-list-row")) {
    let title = node.find(Class("page-link")).next().unwrap();
    let title_text = title.text().trim();

    println!("{}\n", title_text);
}

导致以下错误:

let title_text = title.text().trim();
                 ^^^^^^^^^^^^       - temporary value is freed at the end of this statement
                 |
                 creates a temporary which is freed while still in use

println!("{} - {}\n", i, title_text);
                         ---------- borrow used here, in later iteration of loop

我通过分离 .text().trim() 解决了这个问题

let title_text = title.text();
let trim_text = title_text.trim();

有什么区别?为什么第一次尝试失败了?

最佳答案

乍一看这似乎很复杂,但请记住 String&str 是不同的东西。

String 可以单独存在和使用,但是&str 只是对String 的一部分的引用。因此,只要引用的 String 存在,&str 就可以存在。让我们看看它应该如何处理返回签名。

let title_text = title   .text()   .trim();
//               ^       ^         ^
//               Node    String <- &str
  1. 这里,title 是一个 select::Node .

  2. Node::text返回一个 String,但没有将其绑定(bind)到上下文。

  3. String::trim ,反过来,返回一个 &str,它是对 String 本身的一部分的引用。

最后,借用检查器只是不明白它应该如何处理对 String 的引用,因为它是一个临时值(非绑定(bind)),在上下文中不会存在足够长的时间.

关于rust - 在此语句结束时释放临时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056268/

相关文章:

node.js - 如何链接到本地​​ Rust 库? (类似于 npm 链接)

rust - 如何删除使用 cargo install 安装的二进制文件?

reference - 我可以将局部变量的所有权和对它们的引用转移到返回的迭代器吗?

rust - 了解在迭代器上调用方法两次时如何满足借用检查器?

rust - 我如何在线程和函数之间设置 "share"套接字?

module - 对 rust 模块感到困惑

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust - 为什么不能在同一结构中存储值和对该值的引用?

rust clone() vs Rc 还是 Arc?

rust - 匹配后如何修改值?