撰寫一個函式來查找給定查詢名稱的對應值作為 url 的引數,我收到以下錯誤:
error[E0515]: cannot return value referencing local variable `url`
--> src/main.rs:55:25
|
51 | let mut queries = url.query_pairs();
| ----------------- `url` is borrowed here
...
55 | Some((_, value)) => value
| ^^^^^ returns a value referencing data owned by the current function
代碼:
use url::{self, Url};
fn find_query(referer: String, query_name: &str) -> Cow<str> {
let url_text = Url::parse(&referer).unwrap();
let mut queries = url_text.query_pairs();
let index_of_name = queries.find(|(key,_)| key == query_name);
let result = match index_of_name {
None => panic!("name didn't match any"),
Some((_, value)) => value
};
result
}
雖然我通過下面的修改修復了它,但我仍然不明白為什么我會出現這種型別的錯誤,即使它result本身沒有被借用。錯誤中的訊息“回傳參考當前函式擁有的資料的值”聽起來是對的。
任何人都可以分解此錯誤背后的原因嗎?
先感謝您。
固定代碼:
use url::{self, Url};
fn find_query(referer: String, query_name: &str) -> String {
let url_text = Url::parse(&referer).unwrap();
let queries = url_text.query_pairs();
let index_of_name = queries.into_owned().find(|(key,_)| key == query_name);
let result = match index_of_name {
None => panic!("name didn't match any"),
Some((_, value)) => value
};
result
}
uj5u.com熱心網友回復:
寫作:
let url: Url = todo!();
url.query_pairs()
和寫法一樣:
let url: Url = todo!();
Url::query_pairs(&url) // notice the borrow of url here
這被稱為“統一的函式呼叫語法”。確實,這foo.bar()是一種特殊的語法,是Foo::foo(bar)“默認”語法。
您還可以通過查看以下函式簽名來判斷這種情況正在發生query_pairs:
impl Url {
pub fn query_pairs(&self) -> Parse<'_> {
// ...
}
}
該&self引數表示此函式采用不可變參考呼叫它的結構。
希望這應該說明為什么呼叫into_owned()修復錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/425902.html
上一篇:試圖從我的URL中洗掉檔案擴展名
