我正在创建一个简单的程序,每次读取stdin一行,直到它到达文件的末尾,然后在输入中打印每个字母的频率(即:字符,实际上是Unicode图形符号)。完整的消息来源是关于Github的。。我使用的是rustc版本1.6.0和cargo 0.7.0
在程序中,我定义了一个HashMap<&str, u64>来存储统计信息,使用字母作为键,字母出现的次数作为值。在循环遍历每个字母时,我做以下操作来存储统计数据:
for line in stdin.lock().lines() {
let mut line = line.unwrap().as_str();
// For each line, store it's character.
for grapheme in UnicodeSegmentation::graphemes(line, true) {
match counter.get(grapheme) {
Some(v) => counter.insert(grapheme, v + 1),
None => counter.insert(grapheme, 1)
}
}
}( grapheme 是对字符串的引用。)。
我意识到这可能不是更新hashmap中的计数器的最好方法,但我相信它在技术上应该有效--毕竟我是一个完全的锈菌n00b。
当我cargo build,我得到:
expected `()`,
found `core::option::Option<u64>`
(expected (),
found enum `core::option::Option`) [E0308]
src/main.rs:18 match counter.get(grapheme) {
src/main.rs:19 Some(v) => counter.insert(grapheme, v + 1),
src/main.rs:20 None => counter.insert(grapheme, 1)
src/main.rs:21 }..。通过查看E0308的文档和准确的错误消息,我了解到编译器得到了一种类型,并期望得到另一种类型;但我不明白:
core::option::Option<u64>和core::option::Option之间是否有错配?()和core::option::Option<u64>以及()和core::option::Option之间有两种不匹配吗?
发布于 2016-01-23 15:45:01
在上面的代码中,match表达式具有Option<u64>类型(因为所有分支都有Option<u64>类型)。for循环主体必须以语句结束,因此只需放置一个;即可使match成为一条语句。
match counter.get(grapheme) {
Some(v) => counter.insert(grapheme, v + 1),
None => counter.insert(grapheme, 1)
};想了解更多细节请看这里
https://stackoverflow.com/questions/34965034
复制相似问题