好像什么都借不到的时候借用出错

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() 修复了错误