TL; DR
fn get<T>(&self) -> &T
fn get_mut<T>(&mut self) -> &mut T
fn find(&self) -> &Pair<'a>
fn find_mut(&mut self) -> &mut Pair<'a>
Создание MCVE - жизненно важный навык для эффективного программиста.Мы каталогизируем Rust-специфические методы на теге wiki .Вот один из них для вашего кода:
#[derive(Debug, Default)]
struct Pair<'a>(&'a str);
#[derive(Debug, Default)]
struct Database<'a> {
data: &'a str,
}
impl<'a> Database<'a> {
fn find(&self) -> &'a Pair {
unimplemented!()
}
fn find_mut(&mut self) -> &'a mut Pair {
unimplemented!()
}
}
fn main() {
let mut db = Database::default();
{
db.find_mut();
}
db.find();
}
Проблема возникает из-за того, что вы набросали время жизни без того, чтобы они были правильными.В частности:
fn find(&self) -> &'a Pair
fn find_mut(&mut self) -> &'a mut Pair
Эти методы говорят, что они будут возвращать ссылку на Pair
, которая длится столько же, сколько и данные, которые вы вставили в Database
.Это не может быть правдой, потому что вы вставили данные &'static str
.
Вы действительно хотите:
fn find(&self) -> &Pair<'a>
fn find_mut(&mut self) -> &mut Pair<'a>
Добавление #![deny(rust_2018_idioms)]
в ваш ящик помогает их отловить, хотя ошибкасообщения еще не идеальны:
error: hidden lifetime parameters in types are deprecated
--> src/main.rs:12:27
|
12 | fn find(&self) -> &'a Pair {
| ^^^^- help: indicate the anonymous lifetime: `<'_>`
error: hidden lifetime parameters in types are deprecated
--> src/main.rs:16:39
|
16 | fn find_mut(&mut self) -> &'a mut Pair {
| ^^^^- help: indicate the anonymous lifetime: `<'_>`
Если затем мы вернемся к исходной проблеме, мы увидим, что проблема все еще не исчезла.Так как у нас только что была проблема с временем жизни внутри Pair
, давайте посмотрим, есть ли еще какие-то связанные проблемы:
fn get<T>(&'a self) -> &'a T
fn get_mut<T>(&'a mut self) -> &'a mut T
Это говорит о том, что self
будет жить столько же, сколько и self.key
что не то, что вы хотите в 99% случаев.Удалите эти времена жизни explcit, чтобы разрешить нормальное время жизни:
fn get<T>(&self) -> &T
fn get_mut<T>(&mut self) -> &mut T
См. Также: