在此语句末尾释放临时值

时间:2019-01-05 21:06:38

标签: rust borrow-checker

我正在尝试使用Select条板箱抓取网页:

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();

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

1 个答案:

答案 0 :(得分:5)

乍一看,这似乎有些令人费解,但请记住,String&str是不同的野兽。

String可以生存并且可以单独使用,但是&str只是对String一部分的引用。因此,&str可以生存,只要引用的String生存。让我们看看它应该如何在返回签名上工作。

let title_text = title   .text()   .trim();
//               ^       ^         ^
//               Node    String <- &str
  1. 在这里,titleselect::Node

  2. Node::text返回一个String,但没有任何内容将其绑定到上下文。

  3. String::trim返回一个&str,它引用了String本身的一部分。

最后,借位检查器只是不了解如何处理对String的引用,该引用在上下文中的生存期不会足够长,因为它是一个临时值(非绑定值)。