将常规结构克隆到特定的生命周期?

时间:2017-02-02 06:31:34

标签: rust lifetime

我正在玩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

1 个答案:

答案 0 :(得分:3)

这里有一个根本的误解。

当使用lifetime参数声明Cookie时,这意味着它封装了对具有此生存期的对象的引用。

为了克隆Cookie更长的生命周期,你需要做的就是将它分开,克隆引用的对象更长的生命周期,然后重建一个全新的cookie,引用这个新的更长的时间生活对象。

然而,这不是clone默认 1 ; clone只是传递相同的引用。

因此,克隆Cookie时唯一可以改变的生命周期是减少生命周期,而不是延长它。

1 如果你考虑一下,谁拥有这个新对象?当然不是Cookie,它只是一个参考!