Rust 返回结果::Err()会导致E0308及其阻塞我的错误日志

Rust 返回结果::Err()会导致E0308及其阻塞我的错误日志,rust,Rust,我正在尝试使用Rust为尚未实现的处理器体系结构编写汇编程序。我刚刚完成了lexer,正在尝试构建它,并修复我在开发过程中犯下的任何打字错误和错误 但是,一直阻塞生成日志的一个错误是错误E0308:不匹配的类型。本质上,每次我试图返回一个Result::Err,因为源文件包含了一个rust编译器不希望我出现的错误,我都会得到这个错误。我不在乎rust编译器期望什么。我想在这里写一个汇编程序。如何阻止E0308的发生 示例:这是我的程序中触发此错误的部分 if bin_regex.is_match

我正在尝试使用Rust为尚未实现的处理器体系结构编写汇编程序。我刚刚完成了lexer,正在尝试构建它,并修复我在开发过程中犯下的任何打字错误和错误

但是,一直阻塞生成日志的一个错误是错误E0308:不匹配的类型。本质上,每次我试图返回一个Result::Err,因为源文件包含了一个rust编译器不希望我出现的错误,我都会得到这个错误。我不在乎rust编译器期望什么。我想在这里写一个汇编程序。如何阻止E0308的发生

示例:这是我的程序中触发此错误的部分

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中,如果至少有一个错误且未处于详细模式,将错误字符串的向量返回给主函数,主函数将输出这些字符串并以错误代码退出。它确实具有适当的返回类型。我开始认为我应该链接源存储库,让你们都运行起来……它确实有合适的返回类型。我开始觉得我应该把源代码库链接起来,让你们都疯了。。。