什么是返回多个异常的Java函数的Rust等效返回值?

时间:2014-11-04 16:06:07

标签: rust

Rust中函数的适当返回值是什么,在Java中看起来像这样?

void verify(String input) {
  if (!checkInput(input)) return Exception1("....");
  if (!checkInput2(input)) return Exception2("....");
  if (!checkInput3(input)) return Exception3("....");
}

我认为它应该是Result<(), &str>Result<bool, &str>

2 个答案:

答案 0 :(得分:6)

Rust的当前最新技术:

  • enum代表结果,bool是最简单的&#34;一个
  • Option,用于封装结果,并在出现错误时不提供详细信息
  • 一个Result<R, E>来封装结果或错误

您提出的功能是一项独特的挑战,它可以表示为:

  • Result<(), Error> Error是您想要的任何内容(&str可能过于严格,或者结构不够充分)
  • Option<Error>如果您反转该函数,那就是让它查找错误而不是评估没有

要么看起来很好,Result<(), Error>更容易服从try!之类的。

答案 1 :(得分:3)

虽然你可以拥有Result<(), &'static str>,但使用枚举来获得不同的错误可能性通常会更好。然后,您可以使用字符串格式(std::fmt::Display实现)将其转换为一个很好的错误消息。像这样:

use std::fmt;

enum Error {
    FirstProblem,
    SecondNuisance,
    ThirdBadThing,
}

impl fmt::Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        f.write_str(match *self {
            Error::FirstProblem => "first problem",
            Error::SecondNuisance => "second nuisance",
            Error::ThirdBadThing => "third bad thing",
        })
    }
}

fn verify(input: &str) -> Result<(), Error> {
    if !check_input(input) { return Err(Error::FirstProblem); }
    if !check_input2(input) { return Err(Error::SecondNuisance); }
    if !check_input3(input) { return Err(Error::ThirdBadThing); }
    Ok(())
}

从语义上讲,Result非常好;您的verify函数可以表示一切正常,或者发生错误。如果有错误,则表明它是值得的 - 因此Error类型。如果一切正常,是否有可以传达的额外信息?如果它仅仅是“它有效”的问题,那么你的bool可能总是true,这会否定它的目的。因此,让Ok变体为()是有道理的。