我正在尝试使用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();
有什么区别?为什么第一次尝试失败?
答案 0 :(得分:5)
乍一看,这似乎有些令人费解,但请记住,String
和&str
是不同的野兽。
String
可以生存并且可以单独使用,但是&str
只是对String
一部分的引用。因此,&str
可以生存,只要引用的String
生存。让我们看看它应该如何在返回签名上工作。
let title_text = title .text() .trim();
// ^ ^ ^
// Node String <- &str
在这里,title
是select::Node
。
Node::text
返回一个String
,但没有任何内容将其绑定到上下文。
String::trim
返回一个&str
,它引用了String
本身的一部分。
最后,借位检查器只是不了解如何处理对String
的引用,该引用在上下文中的生存期不会足够长,因为它是一个临时值(非绑定值)。>