2014-11-04 69 views

回答

6

本领域的锈的当前状态:

  • 一个enum来表示结果,bool作为“简单的”一个
  • 一个Option,封装的结果,并给出在情况下,没有详细地错误的
  • 一个Result<R, E>封装任一的结果或错误

你呈现功能是AU NIQUE挑战,它可以表示无论是作为:

  • Result<(), Error>Error是任何你希望它是(&str可能过于严格或不规整不够)
  • Option<Error>如果你反转功能,这是使它看起来而不是评估,有没有

无论是外观精致,Result<(), Error>更加容易服从try!和类似的错误。

+2

不会'Result <(),CustomError>'很适合,其中'CustomError'是一个Enum,状态为'Exception1',通过'Exception3'?这些状态当然可以包含一个字符串。但是这样你可以匹配调用者函数中的所有不同情况。 – marcusklaas 2014-11-04 23:22:27

+1

@marcusklaas:如果你想给呼叫者一个恢复的机会,我会推荐它。像往常一样,访问现成可用的信息要比通过解析字符串等来试图通过它来获得信息要容易得多,而且要简单得多......考虑到'enum'的低成本(只是多一个字),它就是足够便宜,不会让很多不关心它的人负担过重。 – 2014-11-05 07:07:16

+0

什么是错误? – 2014-11-05 12:31:25

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变体为()是有意义的。

+0

为什么不只是'&str'而不是'&'static str'? – 2014-11-05 03:03:22

+1

由于字符串文字具有静态生命周期(整个程序的生命周期):http://doc.rust-lang。org/std/str/ – 2014-11-05 08:32:41

+0

@NemanjaBoric&'static str是一个字符串文字,&str不是? – 2014-11-05 12:57:43