Rust 返回结果::Err()会导致E0308及其阻塞我的错误日志
我正在尝试使用Rust为尚未实现的处理器体系结构编写汇编程序。我刚刚完成了lexer,正在尝试构建它,并修复我在开发过程中犯下的任何打字错误和错误 但是,一直阻塞生成日志的一个错误是错误E0308:不匹配的类型。本质上,每次我试图返回一个Result::Err,因为源文件包含了一个rust编译器不希望我出现的错误,我都会得到这个错误。我不在乎rust编译器期望什么。我想在这里写一个汇编程序。如何阻止E0308的发生 示例:这是我的程序中触发此错误的部分Rust 返回结果::Err()会导致E0308及其阻塞我的错误日志,rust,Rust,我正在尝试使用Rust为尚未实现的处理器体系结构编写汇编程序。我刚刚完成了lexer,正在尝试构建它,并修复我在开发过程中犯下的任何打字错误和错误 但是,一直阻塞生成日志的一个错误是错误E0308:不匹配的类型。本质上,每次我试图返回一个Result::Err,因为源文件包含了一个rust编译器不希望我出现的错误,我都会得到这个错误。我不在乎rust编译器期望什么。我想在这里写一个汇编程序。如何阻止E0308的发生 示例:这是我的程序中触发此错误的部分 if bin_regex.is_match
if bin_regex.is_match(&s[1..25]) {
// Absolute Memory
add_info = AddressInfo::new(ValueType::Binary, AddressMode::AbsoluteMemory);
content = &s[0..25];
} else if bin_regex.is_match(&s[1..17]) {
if &s[17..18] == "p" {
// Absolute Port
add_info = AddressInfo::new(ValueType::Binary, AddressMode::AbsolutePort);
content = &s[0..18];
} else {
// Zero Bank
add_info = AddressInfo:new(ValueType::Binary, AddressMode::ZeroBank);
content = &s[0..17];
} else if bin_regex.is_match(&s[1..9]) {
// Zero Page
add_info = AddressInfo::new(ValueType::Hexadecimal, AddressMode::ZeroPage);
content = &s[0..9];
} else {
// Error
Err(format!("Invalid Binary address or Binary address out of range"))
}
下面是错误的样子:
...
error[E0308]: mismatched types
--> src/lex.rs:407:17
|
401 | } else if bin_regex.is_match(&s[1..9]) {
| ____________________-
402 | | // Zero Page
403 | | add_info = AddressInfo::new(ValueType::Binary, AddressMode::ZeroPage);
404 | | content = &s[0..9];
... | |
407 | | Err(format!("Invalid Binary address or Binary address out of range"))
| | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found enum `std::result::Result`
408 | | }
| |_____________- expected this to be `()`
|
= note: expected unit type `()`
found enum `std::result::Result<_, std::string::String>`
...
错误在锈蚀中并不特别。如果希望从函数返回错误,则该函数必须具有结果返回类型。假设我们有这个函数:
fn divide(a: i64, b: i64) -> i64 {
a / b
}
但是在b==0的情况下有一个问题,所以我们要报告一个错误:
fn divide(a: i64, b: i64) -> i64 {
if b == 0 {
Err("divide by zero")
} else {
a / b
}
}
但这会导致你的错误:
error[E0308]: mismatched types
--> src/main.rs:3:13
|
1 | fn divide(a: i64, b: i64) -> i64 {
| --- expected `i64` because of return type
2 | if b == 0 {
3 | Err("divide by zero")
| ^^^^^^^^^^^^^^^^^^^^^ expected `i64`, found enum `std::result::Result`
|
= note: expected type `i64`
found enum `std::result::Result<_, &str>`
请注意,使用原始字符串作为错误类型不是一种好的做法—这只是一个简单的示例。错误在Rust中并不特殊。如果希望从函数返回错误,则该函数必须具有结果返回类型。假设我们有这个函数:
fn divide(a: i64, b: i64) -> i64 {
a / b
}
但是在b==0的情况下有一个问题,所以我们要报告一个错误:
fn divide(a: i64, b: i64) -> i64 {
if b == 0 {
Err("divide by zero")
} else {
a / b
}
}
但这会导致你的错误:
error[E0308]: mismatched types
--> src/main.rs:3:13
|
1 | fn divide(a: i64, b: i64) -> i64 {
| --- expected `i64` because of return type
2 | if b == 0 {
3 | Err("divide by zero")
| ^^^^^^^^^^^^^^^^^^^^^ expected `i64`, found enum `std::result::Result`
|
= note: expected type `i64`
found enum `std::result::Result<_, &str>`
请注意,使用原始字符串作为错误类型不是一个好的做法-这只是一个简单的示例。如果您只想在发生错误时退出应用程序,那么应该使用panic!而不是错误。。。as Err是一个构造函数,它只创建一个结果对象,而不使用它
pub fn doit() {
if ... {
// ...
} else {
// Error
panic!("Invalid Binary address or Binary address out of range"))
}
}
一般使用恐慌!在某种程度上是不受欢迎的。但对于最初的工作,它通常是好的。稍后,您可能需要更改函数以返回结果,以便更好地处理错误。在这种情况下,您将返回一个错误
pub fn doit() -> Result<(), String> {
if ... {
// ...
} else {
// Error
return Err(format!("Invalid Binary address or Binary address out of range"));
}
Ok(())
}
下一步是使用特定的错误类型对错误进行编码
#[derive(Debug, Clone)]
pub enum Error {
InvalidAddressError,
...
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Invalid Binary address or Binary address out of range")
}
}
pub fn doit() -> Result<(), Error> {
if ... {
// ...
} else {
// Error
return Err(Error::InvalidAddressError);
}
Ok(())
}
如果您只想在发生错误时退出应用程序,那么应该使用panic!而不是错误。。。as Err是一个构造函数,它只创建一个结果对象,而不使用它
pub fn doit() {
if ... {
// ...
} else {
// Error
panic!("Invalid Binary address or Binary address out of range"))
}
}
一般使用恐慌!在某种程度上是不受欢迎的。但对于最初的工作,它通常是好的。稍后,您可能需要更改函数以返回结果,以便更好地处理错误。在这种情况下,您将返回一个错误
pub fn doit() -> Result<(), String> {
if ... {
// ...
} else {
// Error
return Err(format!("Invalid Binary address or Binary address out of range"));
}
Ok(())
}
下一步是使用特定的错误类型对错误进行编码
#[derive(Debug, Clone)]
pub enum Error {
InvalidAddressError,
...
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "Invalid Binary address or Binary address out of range")
}
}
pub fn doit() -> Result<(), Error> {
if ... {
// ...
} else {
// Error
return Err(Error::InvalidAddressError);
}
Ok(())
}
您知道Err是一个类型构造函数,而不是一个函数吗?当您编写Err…,您只是在创建一个新的Err对象,这取决于您如何处理它。也许你的意思是返回错误。。。;?代码位所属的函数返回一个结果,当辅助函数在lexer中返回错误时,它将传播到lex函数,该函数将所有错误字符串放入一个Vec中,如果至少有一个错误且未处于详细模式,将错误字符串向量返回给主函数,主函数将打印出错误字符串并以错误代码退出。您知道Err是类型构造函数,而不是函数吗?当您编写Err…,您只是在创建一个新的Err对象,这取决于您如何处理它。也许你的意思是返回错误。。。;?代码位所属的函数返回一个结果,当辅助函数在lexer中返回错误时,它将传播到lex函数,该函数将所有错误字符串放入一个Vec中,如果至少有一个错误且未处于详细模式,将错误字符串的向量返回给主函数,主函数将输出这些字符串并以错误代码退出。它确实具有适当的返回类型。我开始认为我应该链接源存储库,让你们都运行起来……它确实有合适的返回类型。我开始觉得我应该把源代码库链接起来,让你们都疯了。。。