2016-01-23 14 views
2

我建立一個簡單的程序,其在直到它到達文件的結束的時間中讀取標準輸入一行時,則打印每個字母的頻率(即:字符,實際上技術上的Unicode字形)輸入。 The full source is on Github。我正在使用rustc版本1.6.0和貨物0.7.0不匹配的類型的錯誤插入一個HashMap <&str, u64>

在程序中,我定義了一個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) 
     } 
    } 
} 

(其中graphemeis a reference to a string)。

我知道這可能不是更新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之間?
    • 別的東西?
  • 我不明白如何告訴Rust的編譯器如何用正確的類型解釋事情(即:如何解決問題)。
+2

僅供參考,一旦你解決這個問題,你很可能會碰上[問題解決了這裏(http://stackoverflow.com/q/28512394/155423)。 – Shepmaster

回答

4

這就是說,表達式返回一個Option<u64>,其中()(單位值,因此實際上「沒有」)預計。

應返回的單元值的表達式是match。封閉for回報()(即沒有預期要返回的值),所以match有望回到沒有什麼太。但是它的兩個分支返回insert,Option的結果。

的方式來告訴鏽丟棄的返回值是增加一個;,像這樣的;

match counter.get(grapheme) { 
    Some(v) => counter.insert(grapheme, v + 1), 
    None => counter.insert(grapheme, 1) 
}; //add a ; here 

該錯誤消息是形式expected X, found Y (expected A, found B)的。 XY是完整的錯配的類型,然後,在括號中,AB焦點上,其中第一個不匹配出現的類型的一部分。當涉及泛型的類型發生不匹配時,這特別有用。這裏的一個(人爲)例如:

use std::sync::{Arc, Mutex}; 

fn type_mismatch(x: Arc<Mutex<String>>) {} 

fn main() { 
    let a = Arc::new(Mutex::new(0i32)); 
    type_mismatch(a); 
} 

這提供了以下錯誤:

<anon>:7:19: 7:20 error: mismatched types: 
expected `alloc::arc::Arc<std::sync::mutex::Mutex<collections::string::String>>`, 
    found `alloc::arc::Arc<std::sync::mutex::Mutex<i32>>` 
(expected struct `collections::string::String`, 
    found i32) [E0308] 
<anon>:7  type_mismatch(a); 
         ^

這裏,a變量的類型上不type_mismatch匹配x參數的類型。注意它們的類型是如何相似的,但兩者的差別在於Mutex的類型參數。編譯器專注於此差異,因此您可以更輕鬆地發現它。

隨着您對使用的庫的熟悉程度越來越高,有時只是閱讀所關注的類型就足以幫助您找出問題所在。

3

使用您的代碼match以上的表達式的類型爲Option<u64>(因爲所有分支都有類型Option<u64>)。 A for循環體必須以語句結束,因此只需簡單地將;作爲match的一個聲明。

match counter.get(grapheme) { 
    Some(v) => counter.insert(grapheme, v + 1), 
    None => counter.insert(grapheme, 1) 
}; 

Look here for more details

相關問題