2017-10-09 18 views
4

데이터베이스와 함께 작동하며 저장할 수있는 것을 나타내는 특성을 작성하려고합니다. 이를 위해 형질은 serde::Deserialize 형질을 포함하는 다른 것들로부터 물려받습니다.평생을 필요로하는 특성을 가진 Rust의 제네릭 함수를 어떻게 만듭니 까?

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.

방법 : 나는 다음과 같은 오류를 얻고있다 그러나

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

:

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] } 
} 

다음, 나는 일반적인 기능을 사용하여이 데이터를 쓰기 위해 노력하고 있어요 나는 이것을 해결할 것인가?

답변

3

generic 매개 변수 (이 경우 평생 시간)를 사용하여 Storable을 정의했습니다. 이는 일반 매개 변수가 전체 응용 프로그램에 전파되어야 함을 의미합니다.

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

또한 일반 특정 매개 변수를 결정할 수도 있습니다. 구체적인 유형 또는 수명 (예 : 'static)으로 완료하거나 특성 개체 뒤에 배치하여 완료 할 수 있습니다.

Serde의 a comprehensive page about deserializer lifetimes도 있습니다. DeserializeOwned도 사용할 수 있습니다.

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

당신은 당신의 자신의 특성에 대한 DeserializeOwned와 같은 개념을 사용할 수 있습니다

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

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

잘못된 위치에 'de의 유효 기간이 있습니다. obj의 유효 기간이 아닌 Storable이라는 인수를 지정해야합니다. 대신

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

사용

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

Playground

.

평생 수명이 obj 인 것은 여기서 파생 된 값을 반환하지 않기 때문에 실제로는 중요하지 않습니다. 증명할 필요가있는 것은 S이 평생 'de 일 동안 Storable<'de>을 구현한다는 것입니다.

'de을 모두 제거하려면 the other answer이 나타내는대로 DeserializeOwned을 사용해야합니다.