作者:ke天天_809 | 来源:互联网 | 2023-01-29 11:15
我有一个HashMap
并且需要获得第一个元素:
type VarIdx = std::collections::HashMap;
fn get_first_elem(idx: VarIdx) -> u16 {
let it = idx.iter();
let ret = match it.next() {
Some(x) => x,
NOne=> -1,
};
ret
}
fn main() {}
但代码不编译:
error[E0308]: match arms have incompatible types
--> src/main.rs:5:15
|
5 | let ret = match it.next() {
| _______________^
6 | | Some(x) => x,
7 | | NOne=> -1,
8 | | };
| |_____^ expected tuple, found integral variable
|
= note: expected type `(&u16, &u8)`
found type `{integer}`
note: match arm with an incompatible type
--> src/main.rs:7:17
|
7 | NOne=> -1,
| ^^
我该怎么解决?
1> Peter Hall..:
没有"第一"项目HashMap
.有没有关于为了保证在其中存储的值,也不在其中,你会遍历的顺序.
如果订单很重要,那么也许您可以切换到a BTreeMap
,它会根据密钥保留订单.
如果你只需要获得你遇到的第一个值,换句话说任何值,你可以做一些类似于原始代码的东西:创建一个迭代器,只取第一个值:
fn get_first_elem(idx: VarIdx) -> i16 {
match idx.values().next() {
Some(&x) => x as i16,
NOne=> -1,
}
}
该方法values()
仅在值上创建迭代器.您的错误的原因是iter()
将在成对的键和值上创建一个迭代器,这就是为什么您得到错误"expected tuple".
为了让编译,我不得不改变一些其他的东西:-1
不是一个有效的u16
值,从而有可能变成i16
和你的价值观是u8
如此必须转换为i16
.
作为另一个一般评论,返回-1
表示失败不是很"生锈".这是Option
为了什么,并且,鉴于next()
已经返回Option
,这很容易实现:
fn get_first_elem(idx: VarIdx) -> Option {
idx.values().cloned().next()
}
该.cloned()
是必要的,以转换&u8
迭代器的值代入u8
.
2> oli_obk..:
HashMap::iter
返回一(&Key, &Value)
对迭代器.你想要的是HashMap::values
,它产生的迭代器只产生的值HashMap
.
请注意,值的顺序是随机的.它与您将值放入的顺序或与值的实际值无关.