#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 предпочитает, чтобы вы были чрезвычайно конкретны в отношении того, как эти вещи применяются.