【问题标题】:Passing variables to function and lifetime将变量传递给函数和生命周期
【发布时间】:2019-10-16 10:40:59
【问题描述】:

我想将 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

【问题讨论】:

    标签: rust lifetime


    【解决方案1】:
    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&lt;'a&gt; 在这里出现两次('axFoo 中的生命周期)。由于您没有为生命周期 'a 提供显式值,因此编译器将假定 Foo 作为 HashMap 值和 element Foo 将具有不同的生命周期 'a。这种方法总体上效果很好。

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

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

    【讨论】:

    • 好的。那是有效的。但是当我打印地图的内容时,我有错误。 play.rust-lang.org/…
    • 当前的问题是add_to_map 借用了map,因此在同一范围内使用它可能是不合理的。我不确定您要解决的确切问题,但add_to_map 对我来说似乎很奇怪;如果可以,例如,只需插入像 main 这样的地方,您就不会遇到这个问题(您可以将值的计算委托给助手)。但即便如此,您在此处的 HashMap 也无法移动,这使得它难以使用(类似的代码在 C 或 C++ 等语言中是可能的,但这样也很容易引入错误)。
    • 好的。怎么做?我在问一个例子。也许我应该从函数中返回一个新的 HashMap?
    • 就位插入?
    • 我不明白。请查看并更正我的示例。 play.rust-lang.org/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多