我正在玩cookie::Cookie
,并希望为自己的目的实现一个更简单的饼干罐。
pub struct NaiveCookieJar<'a> {
data: HashMap<(String, String), Cookie<'a>>,
}
impl<'a> NaiveCookieJar<'a> {
pub fn add<'b>(&mut self, domain: &str, name: &str, cookie: &'b Cookie<'b>) -> bool {
let cookie: &'a Cookie = &cookie.clone(); // not working
self.data
.insert((String::from(domain), String::from(name)), *cookie)
.is_some()
}
}
这导致error: E0495: cannot infer an appropriate lifetime for lifetime parameter 'c due to conflicting requirements
我想要的是每个参数,它们只需要与方法本身一样长,并且我可以制作具有'a
生命周期的副本以插入到哈希映射中。所以,如果我有类似
fn global_jar() -> &'static Mutex<NaiveCookieJar<'static>> {
lazy_static! {
static ref JAR: Mutex<NaiveCookieJar<'static>> = Mutex::new(NaiveCookieJar::new());
}
&JAR
}
...或者在任何情况下,cookie jar的寿命都超过了参数,它不会让我陷入实例化具有相应生命周期的结构。
有Cookie::into_owned() -> Cookie<'static>
适合这种特殊情况,但显然我不希望饼干比罐子的寿命更长,如果罐子本身不是静止的。
仅供参考Cookie
Clone
而非ToOwned
答案 0 :(得分:3)
否强>
这里有一个根本的误解。
当使用lifetime参数声明Cookie
时,这意味着它封装了对具有此生存期的对象的引用。
为了克隆Cookie
更长的生命周期,你需要做的就是将它分开,克隆引用的对象更长的生命周期,然后重建一个全新的cookie,引用这个新的更长的时间生活对象。
然而,这不是clone
默认 1 ; clone
只是传递相同的引用。
因此,克隆Cookie
时唯一可以改变的生命周期是减少生命周期,而不是延长它。
1 如果你考虑一下,谁拥有这个新对象?当然不是Cookie
,它只是一个参考!