Rust编译错误:`i64: Termination` trait约束不满足问题排查
解决Rust main函数返回Result的编译错误
编译错误的核心原因:main函数返回的Result<T, E>中,T必须实现Termination trait,而i64并未实现该 trait,因此编译器报错。
你有两种可行的修改方案:
方案一:返回单元类型()(最常用)
将main函数的返回类型改为Result<(), TestError>,最后返回Ok(())即可,单元类型()是标准库中默认实现Termination的类型。修改后的代码如下:
#[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<(), TestError> { println!("Hello, world!"); let foo = test_question("pass".to_string())?; println!("{}", foo); Ok(()) }
方案二:返回退出码ExitCode(需Rust 1.61+)
如果需要将数值作为程序的退出码返回,可以使用std::process::ExitCode,它同样实现了Termination trait。修改后的代码如下:
use std::process::ExitCode; #[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<ExitCode, TestError> { println!("Hello, world!"); let foo = test_question("pass".to_string())?; println!("{}", foo); Ok(ExitCode::from(foo as u8)) }
补充说明
Rust允许main函数返回任何实现了Termination trait的类型,Result<T, E>能实现该 trait的前提是:
T实现TerminationE实现Debug(你的TestError已经通过#[derive(Debug)]满足此要求)
内容的提问来源于stack exchange,提问作者user2556468
相关产品推荐
相关产品推荐

