Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 使用HashMap实现在迭代器上映射的函数的生存期问题_Rust_Generic Programming_Lifetime_Existential Type - Fatal编程技术网

Rust 使用HashMap实现在迭代器上映射的函数的生存期问题

Rust 使用HashMap实现在迭代器上映射的函数的生存期问题,rust,generic-programming,lifetime,existential-type,Rust,Generic Programming,Lifetime,Existential Type,我尝试使用HashMap,实现一个在迭代器上映射的函数: 使用std::collections::HashMap; 使用std::hash::hash; ///使用映射转换它得到的每个元素。如果映射没有帮助,则映射到 ///本身。 fn translate(map:&'a HashMap,stream:S)->impl迭代器+'a+'b 哪里 迭代器+'b, T:Copy+Eq+Hash, { stream.map(| e:T |->T{*map.get(&e).unwrap_或(&e)}) }

我尝试使用
HashMap
,实现一个在迭代器上映射的函数:

使用std::collections::HashMap;
使用std::hash::hash;
///使用映射转换它得到的每个元素。如果映射没有帮助,则映射到
///本身。
fn translate(map:&'a HashMap,stream:S)->impl迭代器+'a+'b
哪里
迭代器+'b,
T:Copy+Eq+Hash,
{
stream.map(| e:T |->T{*map.get(&e).unwrap_或(&e)})
}

我收到此代码的错误消息:

错误[E0495]:由于需求冲突,无法推断适当的生存期
-->src/lib.rs:11:16
|
11 | stream.map(| e:T |->T{*map.get(&e).unwrap_或(&e)})
|                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
注意:首先,生命周期不能超过6:14在函数体上定义的生命周期“a”。。。
-->src/lib.rs:6:14
|
6 | fn translate(map:&a HashMap,stream:S)->impl迭代器+a+'b
|              ^^
=注意:…以便类型兼容:
应为&std::collections::HashMap
找到&&a std::collections::HashMap
注意:但是,生存期必须对6:18在函数体上定义的生存期“b”有效。。。
-->src/lib.rs:6:18
|
6 | fn translate(map:&a HashMap,stream:S)->impl迭代器+a+'b
|                  ^^
注意:…因此返回值对调用有效
-->src/lib.rs:6:66
|
6 | fn translate(map:&a HashMap,stream:S)->impl迭代器+a+'b
|                                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

我还没有弄清楚什么地方出了问题,也没有找到解决办法。

我不得不猜测,因为您没有包含MCVE。您的代码无法编译,表面上存在生命周期错误。您可能指的函数签名是:

fn translate<'a, 'b, S, T>(map: &'a HashMap<T, T>, stream: S) -> impl Iterator<Item = T> + 'a
where
    S: Iterator<Item = T> + 'b,
    T: Copy + Eq + Hash,
    'b: 'a, // Read: "'b outlives 'a"
正如您所看到的,您还缺少
move
关键字,这是闭包绝对需要的。否则,它可能比该函数所拥有的映射更有效


尽管如此,这个函数还是相当密集的。如果您只在一个地方使用它,可能根本不介绍它,这样可以省去一些麻烦?

请包括您收到的错误消息。另外,包括一个这样每个人都在同一页首先:谢谢!你的解决方案有效。请让我详细说明我的问题,以了解我在第一次尝试时做错了什么。1.我理解移动的意义,但为什么我需要它?不是每个引用(因此参数
map
的类型)都是副本类型吗?2.即使我修改我的第一个解决方案以使用关键字
move
,它仍然不起作用。虽然它可以工作,但当我将
'b
替换为
'a
时。显然,这两个函数参数都必须足够长。但是为什么我不能表示返回类型是终生的
'a+'b
?(我以为这就是它们的“切割”(集合论)1。是的,每个引用都是副本类型。不过,如果在闭包中不移动
map
,就不能确保
map
的寿命足够长。如果复制的引用不再有效,它的值是多少?这就是为什么它是被禁止的。2.
'a+
'b`表示
'a
'b
,就像traits一样。据我所知,这样的成语很少使用。如果你真的需要终身的约束,可以考虑在<<代码>中表达它们:子句,就像我做的那样,从我的观点来看,这一点不那么含糊。
fn translate<'a, S, T>(map: &'a HashMap<T, T>, stream: S) -> impl Iterator<Item = T> + 'a
where
    S: Iterator<Item = T> + 'a,
    T: Copy + Eq + Hash,
{
    stream.map(move |e: T| -> T { *map.get(&e).unwrap_or(&e) })
}