2017-07-21 11 views
0

文字列をパースして整数を取得し、matchを使用してエラーをチェックする次のコードを書きました。 Err(e)が表示されたら、エラーeを出力して、デフォルト値を返します。マッチの腕: "ミスマッチした型expected()、整数変数が見つかりました"

:私はエラー expected usize but got `()`を取得し、既定値のリターンを削除した場合

error[E0308]: mismatched types 
    --> src/main.rs:37:32 
    | 
37 |       return 2; 
    |        ^expected(), found integral variable 
    | 
    = note: expected type `()` 
       found type `{integer} 

:それは()を入力期待するが、整数を得たとして

return match t.parse::<usize>() { 
    Ok(n) => n, 
    Err(e) => { 
     println!("Couldn't parse the value for gateway_threads {}", e); 
     // Return two as a default value 
     return 2; 
    }, 
}; 

しかし、そのコードは、コンパイルに失敗します

error[E0308]: match arms have incompatible types 
    --> src/main.rs:33:24 
    | 
33 |     return match t.parse::<usize>() { 
    | ________________________^ 
34 | |      Ok(n) => n, 
35 | |      Err(e) => { 
36 | |       println!("Couldn't parse the value for gateway_threads {}", e); //TODO: Log this 
37 | |       //return 2; 
38 | |      }, 
39 | |     }; 
    | |_________________^ expected usize, found() 
    | 
    = note: expected type `usize` 
       found type `()` 
note: match arm with an incompatible type 
    --> src/main.rs:35:31 
    | 
35 |      Err(e) => { 
    | _______________________________^ 
36 | |       println!("Couldn't parse the value for gateway_threads {}", e); //TODO: Log this 
37 | |       //return 2; 
38 | |      }, 
    | |_____________________^ 

完全なコード(一部の値を取得するためにINI設定ファイルを解析しています):

extern crate threadpool; 
extern crate ini; 

use std::net::{TcpListener, TcpStream}; 
use std::io::Read; 
use std::process; 
use threadpool::ThreadPool; 
use ini::Ini; 

fn main() { 

    let mut amount_workers: usize; 
    let mut network_listen = String::with_capacity(21); 
    //Load INI 
    { 
     let conf: Ini = match Ini::load_from_file("/etc/iotcloud/conf.ini") { 
      Ok(t) => t, 
      Err(e) => { 
       println!("Error load ini file {}", e); 
       process::exit(0); 
      }, 
     }; 
     let section = match conf.section(Some("network".to_owned())) { 
      Some(t) => t, 
      None => { 
       println!("Couldn't find the network "); 
       process::exit(0); 
      }, 
     }; 
     //amount_workers = section.get("gateway_threads").unwrap().parse().unwrap(); 
     amount_workers = match section.get("gateway_threads") { 
      Some(t) => { 
       return match t.parse::<usize>() { 
        Ok(n) => n, 
        Err(e) => { 
         println!("Couldn't parse the value for gateway_threads {}", e); 
         // Return two as a default value 
         return 2; //ERROR HERE; 
        }, 
       }; 
      }, 
      None => 2, // Return two as a default value 
     }; 
     let ip = section.get("bind_ip").unwrap(); 
     let port = section.get("bind_port").unwrap(); 
     network_listen.push_str(ip); 
     network_listen.push_str(":"); 
     network_listen.push_str(port); 
    } 
} 

このエラーの原因を教えてください。 ;で文を終わらない

amount_workers = match section.get("gateway_threads") { 
    Some(t) => { 
     match t.parse::<usize>() { // No return 
      Ok(n) => n, 
      Err(e) => { 
       println!("Couldn't parse the value for gateway_threads {}", e); //TODO: Log this 
       2 // No semicolon, no return 
      } 
     } // No semicolon 
    } 
    None => 2, //Default value is set to 2 
}; 

+0

あなたは 'Err'ブランチで何をしたいですか? *何かを返すか、 'パニック!(...)'を呼ぶ必要があります。 –

+0

@FlorianWeimer返り値2にデフォルト値を設定したい。私はエラー(expected)を得て、積分変数を見つけたので、コメントにあります。 – Olof

+0

しかし、 'return 2'では、コンパイルは正しく行われますか?そうでない場合は、実際に興味のないコードバリエーションのエラーではなく、そのエラーを表示してください。 –

答えて

2

変更

amount_workers = match section.get("gateway_threads") { 
    Some(t) => { 
     return match t.parse::<usize>() { 
      Ok(n) => n, 
      Err(e) => { 
       println!("Couldn't parse the value for gateway_threads {}", e); //TODO: Log this 
       return 2; //ERROR HERE; //Default value is set to 2 
      } 
     }; 
    } 
    None => 2, //Default value is set to 2 
}; 

は、あなたが錆の値を返す方法です。 returnキーワードは、関数全体が最後の行の前に値を返すようにするために使用されます。そのため、これを「早期返却」と呼びます。

Rustが式hereをどのように処理するかについての詳細を参照してください。

関連する問題