将变量传递给函数和生命周期

Passing variables to function and lifetime

我想将 HashMap 和元素 - Foo 传递给我的 function。 我不明白变量的生命周期。请帮忙

结果:错误[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
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>在这里出现了两次('aFoo里面x的生命周期)。由于您没有为生命周期 'a 提供显式值,编译器将假定 Foo 作为 HashMap 值,而 element Foo 将具有不同的值寿命 'a。这种方法通常效果很好。

但是,您实际上想将 element 插入到 map 中,这需要 匹配寿命。编译器拒绝你的代码,因为生命周期没有 比赛。您需要明确 Foox 的生命周期,例如

// 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 in add_to_map