Определение ожидаемого времени жизни при реализации признаков

#rust

#Ржавчина

Вопрос:

Я пытаюсь реализовать «сеттер», подобный черте, для структуры. Смотрите код ниже:

 struct Buffer<'a>{
    data: amp;'a i32
}

trait Setter {
    fn set_value(amp; mut self, c: amp; i32) -> ();
}

impl<'b> Setter for Buffer<'b> {
    fn set_value(amp; mut self, c: amp; i32) -> () {
        self.data = c;
    }
}
  

Код довольно прост, set_value все, что он делает, это устанавливает данные равными c .

Когда я пытаюсь скомпилировать код, он не может скомпилироваться с «время жизни ссылки превышает время жизни заимствованного содержимого», и я понимаю, почему это происходит. Существует разница между временем жизни предложения реализации и самой функцией.

Мой вопрос в том, как я могу это преодолеть? Я попытался определить, что время жизни set_value должно превышать время жизни ‘b, но затем я начинаю сталкиваться с проблемами между сигнатурой признака и фактической реализацией.

Ответ №1:

Эти сроки жизни должны проникать глубже в вашу реализацию, например:

 struct Buffer<'a>{
    data: amp;'a i32
}

trait Setter<'b> {
    fn set_value(amp;'b mut self, c: amp;'b i32) -> ();
}

impl<'b> Setter<'b> for Buffer<'b> {
    fn set_value(amp;'b mut self, c: amp;'b i32) -> () {
        self.data = c;
    }
}
  

Где это говорит о том, что «время жизни Buffer не будет превышать c заданное».

Комментарии:

1. Спасибо! Это сработало. Выражается ли «время жизни буфера не будет превышать время жизни заданного c», устанавливая одинаковое время жизни для «self» и c в функции set_value? Если это так, зачем нам нужно повторять определение времени жизни как внутри признака, так и в реализации признака?

2. Говоря, что они оба имеют одинаковое время жизни, вы гарантируете, что Buffer они не будут использовать данную c ссылку. Поскольку сигнатура функции имеет время жизни в реализации, trait необходимо также включить их, чтобы подписи совпадали. Вы можете попробовать пропустить здесь что-то и увидеть различные всплывающие ошибки. Это кажется немного подробным и жестким, но Rust предпочитает, чтобы вы были чрезвычайно конкретны в отношении того, как эти вещи применяются.