在此语句末尾释放临时值

mot*_*son 6 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);
}
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

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);
}
Run Code Online (Sandbox Code Playgroud)

我通过将.text()和分开来解决了.trim()

let title_text = title.text();
let trim_text = title_text.trim();
Run Code Online (Sandbox Code Playgroud)

有什么不同?为什么第一次尝试失败?

TSB*_*99X 8

这一次似乎令人费解在第一,但请记住,String并且&str是不同的东西。

String可以独立生存和使用,但&str仅引用的一部分String。所以,&str可以活到参考String寿命。让我们看看它应该如何在返回签名上工作。

let title_text = title   .text()   .trim();
//               ^       ^         ^
//               Node    String <- &str
Run Code Online (Sandbox Code Playgroud)
  1. title是一个select::Node

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

  3. String::trim,然后返回a &str,它是对String自身一部分的引用。

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

  • @ rm.rf.etc如果可以容忍副本,则可以使用title.text()。trim()。to_string()`。 (3认同)
  • 有没有办法在不声明新变量的情况下解决这个问题? (2认同)

归档时间:

查看次数:

2205 次

最近记录:

6 年,10 月 前