我正在研究Rust中的一个程序,我被卡在match
上。我目前有
extern crate regex;
use std::collections::HashMap;
fn main() {
let s = "";
let re = regex::Regex::new(r"[^A-Za-z0-9\w'").unwrap();
let s = re.split(s).collect::<Vec<&str>>();
let mut h: HashMap<String, u32> = HashMap::new();
for x in s {
match h.get(x) {
Some(i) => h.entry(x.to_string()).or_insert_with(i + 1),
None => h.entry(x.to_string()).or_insert_with(1),
}
}
}
但是当我运行这个时,我得到了一连串的错误,包括
error: the trait bound `u32: std::ops::FnOnce<()>` is not satisfied [E0277]
Some(i) => h.entry(x.to_string()).or_insert_with(i + 1),
^~~~~~~~~~~~~~
我并不确定该去哪里。
答案 0 :(得分:3)
or_with
函数系列期望一个函数将值作为参数返回。你想要.or_insert
,它直接期望值:
let re = regex::Regex::new(r"[^A-Za-z0-9\w'").unwrap();
let s = re.split(s).collect::<Vec<&str>>();
let mut h: HashMap<String, u32> = HashMap::new();
for x in s {
match h.get(x) {
Some(i) => h.entry(x.to_string()).or_insert(i + 1),
None => h.entry(x.to_string()).or_insert(1),
}
}
无论如何,您忽略了Entry
API的重点:
let re = regex::Regex::new(r"[^A-Za-z0-9\w'").unwrap();
let s = re.split(s).collect::<Vec<&str>>();
let mut h: HashMap<String, u32> = HashMap::new();
for x in s {
match h.entry(x.to_string()) {
Entry::Vacant(v) => {
v.insert(1);
},
Entry::Occupied(o) => {
*o.into_mut() += 1;
},
}
}