我遇到了将一个 (String, String)
的迭代器转换为 (&str, &str)
的迭代器的问题。我正在使用一个外部库,所以不能更改其签名,也不确定是否需要更改。基本上,我有这个函数定义:
use hyper;
fn build_url<'a, I>(host: &'a str, port: u16, path: &'a str, params: I) ->
hyper::Url where I: Iterator<Item=(String, String)> {
let mut url = hyper::Url::parse(&format!("http://{h}:{p}/{pt}",
h = self.etcd_host,
p = self.etcd_port,
pt = path));
if let Err(e) = url {
panic!("error parsing url: {}", e);
}
let mut url = url.unwrap();
// fn set_query_from_pairs<'a, I>(&mut self, pairs: I)
// where I: Iterator<Item=(&'a str, &'a str)>
url.set_query_from_pairs(
params.map(|x: (String, String)| ->
(&str, &str) { let (ref k, ref v) = x; (k, v) } ));
}
但是我遇到了可怕的错误:error: 'x.0' does not live long enough
我认为在let中使用ref
关键字应该是正确的做法,即将所有权保留在迭代器中,只进行借用。如果我将let更改为以下内容,则会遇到类似的问题:
let (k, v) = x; (&k, &v)
然后k
和v
的寿命不够长。有人有修复建议吗?
params
迭代器?它是一个映射还是一个向量?如果是这样,你可以从中创建一个非拥有迭代器,然后将其映射到一个(&str, &str)
迭代器。 - oli_obk