2017-02-02 5 views
2

私は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() 
    } 
} 

これは私がしたいことは、彼らが唯一の方法そのものと同じくらい長く生きるために必要な、引数のそれぞれのためである、と私はハッシュに挿入する'a寿命でコピーを作ることができerror: E0495: cannot infer an appropriate lifetime for lifetime parameter 'c due to conflicting requirements

の結果地図。私はクッキージャーが長い引数よりも住んでいることを

fn global_jar() -> &'static Mutex<NaiveCookieJar<'static>> { 
    lazy_static! { 
     static ref JAR: Mutex<NaiveCookieJar<'static>> = Mutex::new(NaiveCookieJar::new()); 
    } 
    &JAR 
} 

...または任意の例のようなものを持っているそうだとすれば、それは罠ではないだろう、私は、対応する寿命と構造体をインスタンス化します。

この特定のケースに適合するCookie::into_owned() -> Cookie<'static>がありますが、明らかに、jarが静的なものではない場合、クッキーがjarより長く存続することは望ましくありません。

FYI Cookieはここに根本的な誤解がありCloneなくToOwned

答えて

3


を導出します。

Cookieが有効期間パラメータで宣言されている場合は、この有効期間のオブジェクトへの参照をカプセル化することを意味します。

をより長く生存させるためには、それを解きほぐし、参照されたオブジェクトをより長く生存させた後、この新しいより長命のオブジェクトを参照する新しいクッキーを再構築する必要があります。

ただし、デフォルトではcloneが実行されません。; cloneは、と同じの参照を単に渡します。

したがって、Cookieのクローン作成時に取得できるライフタイムの変更は、になります。寿命は延長されず、延長されます。

あなたはそれについて考えると、誰が新しいオブジェクトを所有するのですか?確かにCookieではない、それはちょうど参照があります!

+0

あなたは正しいです。 'Cookie'は' cookie_string:Option > 'を保持します。しかし、私はそのようなスマートなポインタは、インテリジェントな方法で参照されたデータをコピーする能力があるはずだと思う? Cookieのすべてのメンバーはプライベートですが、set_xxx(get_xxx())の束ではなく)そのようなコピーを行う正しい方法は何ですか? –

+0

@FrederickZhang:あなたはそのタイプのパブリックAPIに悩まされています(これはAPIなのです)。私はそれがあなたがデフォルトを作成する必要がない場合は、 'Cookie :: new(prev.get_xxx()、prev.get_yyy()、new_cookie_string、...)'のようなコンストラクタを持っていると思いますクッキーとセッターを使用してください。 –

+0

悲しいことに、そのようなAPIはありません。実際には 'cookie_string'に直接アクセスすることはできませんが、提供されたAPIを介して' domain'、 'name'などにしかアクセスできません。しかしこれは 'let cookie = Cookie :: parse(cookie.to_string())。unwrap();'と事実上同じですが、これは醜く非効率的です。 –

関連する問題