簡體   English   中英

如何在Rust中創建一個具有生命周期特征的泛型函數?

[英]How do you create a generic function in Rust with a trait requiring a lifetime?

我正在嘗試編寫一個與數據庫一起工作的特征,並表示可以存儲的內容。 為此,特征繼承自其他特征,其中包括serde::Deserialize特征。

trait Storable<'de>: Serialize + Deserialize<'de> {
    fn global_id() -> &'static [u8];
    fn instance_id(&self) -> Vec<u8>;
}

struct Example {
    a: u8,
    b: u8
}

impl<'de> Storable<'de> for Example {
    fn global_id() -> &'static [u8] { b"p" }
    fn instance_id(&self) -> Vec<u8> { vec![self.a, self.b] }
}

接下來,我嘗試使用通用函數編寫此數據:

pub fn put<'de, S: Storable>(&mut self, obj: &'de S) -> Result<(), String> {
    ...
    let value = bincode::serialize(obj, bincode::Infinite);
    ...
    db.put(key, value).map_err(|e| e.to_string())
}

但是,我收到以下錯誤:

error[E0106]: missing lifetime specifier
--> src/database.rs:180:24
    |
180 |     pub fn put<'de, S: Storable>(&mut self, obj: &'de S) -> Result<(), String> {
    |                        ^^^^^^^^ expected lifetime parameter

在操場上最小的例子。

我該如何解決這個問題,可能完全避免它?

你有'de生命在錯誤的地方 - 你需要它來指定Storable的參數,而不是參考obj的生命周期。

代替

fn to_json<'de, S: Storable>(obj: &'de S) -> String {

使用

fn to_json<'de, S: Storable<'de>>(obj: &S) -> String {

游樂場

obj的生命周期在這里並不重要,因為你沒有返回從它派生的任何值。 所有你需要證明的是, S實現了Storable<'de>一段生命'de

如果你想徹底消除'de degether,你應該使用DeserializeOwned ,正如另一個答案所描述的那樣。

您已使用通用參數定義了Storable ,在本例中為生命周期。 這意味着通用參數必須在整個應用程序中傳播:

fn put<'de, S: Storable<'de>>(obj: &'de S) -> Result<(), String> { /* ... */ }

您還可以決定使用通用特定的。 這可以通過具體類型或生命周期(例如'static )來完成,或者通過將其放在特征對象后面來完成。

Serde還有一個關於解串器生命周期的綜合頁面 它提到你也可以選擇使用DeserializeOwned

trait Storable: Serialize + DeserializeOwned { /* ... */ }

您也可以使用與DeserializeOwned相同的概念作為您自己的特征:

trait StorableOwned: for<'de> Storable<'de> { }

fn put<'de, S: StorableOwned>(obj: &'de S) -> Result<(), String> {

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM