如何在Rust中指定Some参数的类型?

时间:2016-06-20 22:07:27

标签: pattern-matching rust

我正在研究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),
                                              ^~~~~~~~~~~~~~

我并不确定该去哪里。

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;
      },
    }
}