我正在尝试编写一个特征,该特征可与数据库一起使用并表示可以存储的东西。为此,特质是从包括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
我该如何解决,可能完全避免呢?
您已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> {
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句