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>
。
答案 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
变体为()
是有道理的。