在此语句结束时释放临时值
Temporary value is freed at the end of this statement
我正在尝试使用 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
的一部分的引用。因此,&str
的寿命与引用的 String
的寿命一样长。让我们看看它应该如何处理 return 签名。
let title_text = title .text() .trim();
// ^ ^ ^
// Node String <- &str
这里,title
是一个select::Node
。
Node::text
return 是一个 String
,但没有将其绑定到上下文。
String::trim
反过来,return 是一个 &str
,它是对 String
本身的一部分的引用。
最后,借用检查器只是不明白它应该如何处理对 String
的引用,因为它是一个临时值(非绑定),所以在上下文中不会存在足够长的时间。
我正在尝试使用 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
的一部分的引用。因此,&str
的寿命与引用的 String
的寿命一样长。让我们看看它应该如何处理 return 签名。
let title_text = title .text() .trim();
// ^ ^ ^
// Node String <- &str
这里,
title
是一个select::Node
。Node::text
return 是一个String
,但没有将其绑定到上下文。String::trim
反过来,return 是一个&str
,它是对String
本身的一部分的引用。
最后,借用检查器只是不明白它应该如何处理对 String
的引用,因为它是一个临时值(非绑定),所以在上下文中不会存在足够长的时间。