匹配武器:“不匹配类型expected(),找到积分变量”

时间:2017-07-21 12:25:38

标签: rust

我编写了以下代码来解析字符串以获取其中编码的整数,并使用match检查错误。如果我收到Err(e)我想打印错误e,并返回默认值。

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

如果我删除了默认值的返回值,我会收到错误expected usize but got `()`

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

导致此错误的原因是什么?

1 个答案:

答案 0 :(得分: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
};

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

不使用;结束语句是如何在Rust中返回值。当您希望整个函数在最后一行之前返回一个值时,将使用return关键字,这就是您将其称为“提前返回”的原因。

您可以找到有关Rust如何处理表达式here的更多信息。