Передача переменных в функцию и время жизни - PullRequest
1 голос
/ 16 октября 2019

Я хочу передать HashMap и элемент - Foo в мою функцию . Я не понимаю время жизни переменных. Пожалуйста, помогите.

Результат: ошибка [ E0623 ]: несоответствие времени жизни

use std::collections::HashMap;

#[derive(Debug)]
struct Foo<'a> {
    x: &'a i32,
}

fn add_to_map<'l>(map: &'l HashMap<u32, &'l Foo>,  element : &'l Foo) 
{
    map.insert(1, element);
}

fn main()
{
    let mut map: HashMap<u32, &Foo> = HashMap::new();

    let v = 5;
    let mut f = Foo { x: &v };
    add_to_map(&map, &f);
    println!("now f is {:?}", f);
}

Выход компилятора:

error[E0623]: lifetime mismatch
  --> src/main.rs:11:19
   |
9  | fn add_to_map<'l>(map: &'l HashMap<u32, &'l Foo>,  element : &'l Foo) 
   |                                             ---                  --- these two types are declared with different lifetimes...
10 | {
11 |     map.insert(1, element);
   |                   ^^^^^^^ ...but data from `element` flows into `map` here

error: aborting due to previous error

1 Ответ

4 голосов
/ 16 октября 2019
9  | fn add_to_map<'l>(map: &'l HashMap<u32, &'l Foo>,  element : &'l Foo) 
   |                                             ---                  --- these two types are declared with different lifetimes...
10

Foo<'a> появляется здесь дважды ('a - время жизни x внутри Foo). Поскольку вы не указали явные значения для времени жизни 'a, компилятор будет считать, что Foo в качестве значения HashMap и element Foo будут иметь разные времена жизни 'a. В общем, этот подход хорошо работает.

Однако вы действительно хотите вставить element в map, что требует сопоставления времени жизни. Компилятор отклоняет ваш код, поскольку время жизни не совпадает. Вам необходимо четко указать время жизни x внутри Foo, например,

// Verbose.
fn add_to_map<'l>(map: &'l mut HashMap<u32, &'l Foo<'l>>,  element : &'l Foo<'l>) 

Вам не нужно , чтобы указывать явное время жизни map, посколькуна месте вызова компилятор может проверить, что map живет по крайней мере столько, сколько element,

// Slightly less verbose.
fn add_to_map<'l>(map: &mut HashMap<u32, &'l Foo<'l>>,  element : &'l Foo<'l>) 

Обратите внимание, что в любом случае map должно быть mut в add_to_map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...