将变量传递给函数和生命周期
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>
在这里出现了两次('a
是Foo
里面x
的生命周期)。由于您没有为生命周期 'a
提供显式值,编译器将假定 Foo
作为 HashMap
值,而 element
Foo
将具有不同的值寿命 'a
。这种方法通常效果很好。
但是,您实际上想将 element
插入到 map
中,这需要
匹配寿命。编译器拒绝你的代码,因为生命周期没有
比赛。您需要明确 Foo
中 x
的生命周期,例如
// 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
。
我想将 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>
在这里出现了两次('a
是Foo
里面x
的生命周期)。由于您没有为生命周期 'a
提供显式值,编译器将假定 Foo
作为 HashMap
值,而 element
Foo
将具有不同的值寿命 'a
。这种方法通常效果很好。
但是,您实际上想将 element
插入到 map
中,这需要
匹配寿命。编译器拒绝你的代码,因为生命周期没有
比赛。您需要明确 Foo
中 x
的生命周期,例如
// 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
。