【问题标题】:How to use a Result when there is no success value to return from a function?当函数没有返回成功值时如何使用结果?
【发布时间】:2018-08-19 03:11:34
【问题描述】:

要定义一个返回 void 的函数,我的代码如下:

trait Handler {
    fn on_message(&mut self, msg: String) -> Result<()> {
        println!("on_message: {}", msg);
        Ok(())
    }
}

编译器告诉我这是错误的,因为 Result 应该始终有 2 个参数:

error[E0243]: wrong number of type arguments: expected 2, found 1
 --> src/lib.rs:2:46
  |
2 |     fn on_message(&mut self, msg: String) -> Result<()> {
  |                                              ^^^^^^^^^^ expected 2 type arguments

这让我很困惑。不关心返回值的函数应该如何定义?

【问题讨论】:

  • 你仍然应该添加一个错误作为第二个参数,因为你的函数可能仍然返回一个错误。
  • void 只是 () 所以你可以只是 on_message(&amp;mut self, msg: String) -&gt; () 或只是 on_message(&amp;mut self, msg: String) 但函数应该已经返回一般的东西
  • @Stargateur 显然,OP 需要一些错误处理。 Result&lt;(), ErrorType&gt; 对此很好。

标签: error-handling rust


【解决方案1】:

如果你不需要错误处理,那么就没有必要使用Result

fn on_message(&mut self, msg: String) { 
    // ... 
}

如果你需要处理错误,但没有有意义的“成功”值,那么你可以说成功类型是(),但你仍然需要说错误类型是什么:

fn on_message(&mut self, msg: String) -> Result<(), MyError> {
    // ...
}

在我放置MyError 的地方,您可以使用像io::Error 这样的内置错误、自定义错误结构或枚举,或者像String 这样的任何其他类型。它甚至可以是(),使您的返回类型为Result&lt;(), ()&gt;,这将使您的函数的用户知道它是否成功,而无需提供有关成功结果或可能错误的任何信息。此时,您可能会考虑使用Option&lt;()&gt; 甚至只是bool,它们携带的信息量相同。

【讨论】:

    【解决方案2】:

    错误消息试图告诉您Result 采用两个类型参数,即Result&lt;(), ()&gt;。这是一个工作版本:

    trait Handler {
        fn on_message(&mut self, msg: String) -> Result<(), ()> {
            println!("on_message: {}", msg);
            Ok(())
        }
    }
    

    【讨论】:

    • 这个答案带来了什么,而已经建议使用Result&lt;(), ()&gt; 的现有答案没有带来什么?
    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 2011-11-18
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2016-08-21
    相关资源
    最近更新 更多