好像什么都借不到的时候借用出错
Error about borrowing when nothing seems to be borrowed
编写一个函数以从 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
本身不是借来的。错误消息“returns 引用当前函数拥有的数据的值”听起来是对的。
任何人都可以分析这个错误背后的原因吗?
提前致谢。
固定码:
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
}
写作:
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()
修复了错误
编写一个函数以从 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
本身不是借来的。错误消息“returns 引用当前函数拥有的数据的值”听起来是对的。
任何人都可以分析这个错误背后的原因吗?
提前致谢。
固定码:
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
}
写作:
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()
修复了错误