J'essaie d'écrire un trait qui fonctionne avec une base de données et représente quelque chose qui peut être stocké. Pour ce faire, le trait hérite des autres, ce qui inclut le trait serde::Deserialize
.Comment créer une fonction générique dans Rust avec un trait nécessitant une durée de vie?
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] }
}
Ensuite, je suis en train d'écrire ces données en utilisant une fonction générique:
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())
}
Cependant, je reçois l'erreur suivante:
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
Minimal example on the playground.
Comment est-ce que je résoudrais cela, peut-être l'éviterais-je tout à fait?