rust trait绑定`i64:Termination`不满足`Result< i64,TestError>`实现`Termination`的要求

cyvaqqii  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(125)

只是在学习生 rust 并试图理解“?”运算符。
有以下代码:

#[derive(Debug)]
enum TestError {
    Case1,
    Case2,
    Case3,
}

fn test_question(case: String) -> Result<i64, TestError> {
    if case == "case1" {
        Err(TestError::Case1)
    } else if case == "case2" {
        Err(TestError::Case2)
    } else if case == "case3" {
        Err(TestError::Case3)
    } else {Ok(1)}
}

fn main() -> Result<i64, TestError> {
    println!("Hello, world!");

    let foo = test_question ("pass".to_string())?;
    println!("{}", foo);

    Ok(foo)
}

字符串
在“标题”中接收错误-我做错了什么?
Shawn
希望程序编译并返回% 1。

11dmarpk

11dmarpk1#

如果您尝试从main返回i64,即使没有Result也会出现此问题:

fn main() -> i64 {
    todo!()
}

个字符
如果main实现了Termination,则只能从main返回值。此trait的目的是将值转换为ExitCode,并且不存在从i64到退出代码的一对一Map,因为并非所有平台都支持完整的值域。(例如,Linux只支持0-255的值,这是u8的域。)因此,i64不实现Termination,这就是编译器在错误消息中告诉您这一点的原因。
考虑返回Result<(), TestError>
如果你想让程序以确切的返回代码1终止,将返回类型改为Result<ExitCode, TestError>并返回Ok(ExitCode::from(1))

相关问题