Rust 火柴武器:“;应为不匹配的类型(),找到整型变量“;

Rust 火柴武器:“;应为不匹配的类型(),找到整型变量“;,rust,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 d

我编写了以下代码来解析一个字符串,以获取其中编码的整数,并使用
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;
    },
};
如果删除默认值的返回,则会出现错误
预期usize,但得到“()”

错误[E0308]:匹配臂的类型不兼容
-->src/main.rs:33:24
|
33 |返回匹配t.parse::(){
|  ________________________^
34 | | Ok(n)=>n,
35 | | Err(e)=>{
36 | | println!(“无法分析网关_线程{},e)的值);//TODO:记录此操作
37 | |//返回2;
38 | |                     },
39 | |                 };
||uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
|
=注意:应为'usize'类型`
找到类型“%1”()`
注意:将arm与不兼容的类型匹配
-->src/main.rs:35:31
|
35 |错误(e)=>{
|  _______________________________^
36 | | println!(“无法分析网关_线程{},e)的值);//TODO:记录此操作
37 | |//返回2;
38 | |                     },
| |_____________________^
完整代码(我正在解析INI配置文件以获取一些值):

extern板条箱螺纹池;
外部板条箱;
使用std::net::{TcpListener,TcpStream};
使用std::io::Read;
使用std::过程;
使用threadpool::threadpool;
使用ini::ini;
fn main(){
让多个工人:使用;
让mut network_listen=String::具有_容量(21);
//加载INI
{
让conf:Ini=match Ini::从_文件(“/etc/iotcloud/conf.Ini”)加载_{
Ok(t)=>t,
错误(e)=>{
println!(“错误加载ini文件{}”,e);
进程::退出(0);
},
};
让section=match conf.section(Some(“network.to_owned())){
一些(t)=>t,
无=>{
println!(“找不到网络”);
进程::退出(0);
},
};
//amount\u workers=section.get(“网关线程”).unwrap().parse().unwrap();
amount\u workers=match section.get(“网关线程”){
一些(t)=>{
返回匹配的t.parse::(){
Ok(n)=>n,
错误(e)=>{
println!(“无法分析网关线程{}的值,e);
//返回2作为默认值
返回2;//此处出错;
},
};
},
None=>2,//返回2作为默认值
};
让ip=section.get(“bind_ip”).unwrap();
let port=section.get(“bind_port”).unwrap();
网络监听、推送(ip);
网络监听。按str(“:”);
网络监听、推送(端口);
}
}
什么原因导致此错误?

更改

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\u workers=match section.get(“网关线程”){
一些(t)=>{
返回匹配的t.parse::(){
Ok(n)=>n,
错误(e)=>{
println!(“无法分析网关线程{},e)的值;//TODO:记录此操作
返回2;//此处出错;//默认值设置为2
}
};
}
None=>2,//默认值设置为2
};

amount\u workers=match section.get(“网关线程”){
一些(t)=>{
匹配t.parse::(){//不返回
Ok(n)=>n,
错误(e)=>{
println!(“无法分析网关线程{},e)的值;//TODO:记录此操作
2//无分号,无返回
}
}//没有分号
}
None=>2,//默认值设置为2
};
不以
结尾语句是在Rust中返回值的方式。当您希望整个函数返回最后一行之前的值时,将使用
return
关键字,这就是为什么您将其称为“提前返回”


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

您想在
Err
分支中做什么?你必须返回一些东西,或者调用
panic!(…)
@FlorianWeimer我想返回2来设置默认值。它在注释中,因为我得到了预期的错误(),找到了整数变量,但是使用
return2
,它会编译,对吗?如果不是,请显示该错误,而不是您实际不感兴趣的代码变体的错误。不,我将在顶部看到您看到的第一个错误。很难判断发生了什么,因为您的示例不完整。您至少需要显示完整的函数。它看起来像是返回
()
,而不是
usize
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
};