【问题标题】:What are the pros and cons of impl TryFrom<Bar> for Foo vs impl From<Bar> for Result<Foo, ()> for fallible conversions?impl TryFrom<Bar> for Foo 与 impl From<Bar> for Result<Foo, ()> 的优缺点是什么?
【发布时间】:2020-10-15 09:14:48
【问题描述】:

从 Rust 1.34 开始,我们可以通过实现 TryFrom trait 来编写类型之间的错误转换:

struct Foo(i32);
struct Bar;

impl TryFrom<Bar> for Foo {
    type Error = ();
    fn try_from(_b: Bar) -> Result<Foo, ()> {
        Ok(Foo(42))
    }
}

在 Rust 1.41 中,孤儿规则已经放宽,所以我们也可以这样写:

struct Foo(i32);
struct Bar;

impl From<Bar> for Result<Foo, ()> {
    fn from(_b: Bar) -> Result<Foo, ()> {
        Ok(Foo(42))
    }
}

根据this trial 的说法,这两种解决方案似乎都同样有效。

采用一种或两种方法的优缺点是什么?两者如何选择?

这个问题对生态系统很重要。例如,板条箱作者需要关于是否支持TryFromFrom 或两者的建议。宏编写者需要知道是否需要同时处理这两种情况等。这取决于当今生态系统的状态,不能轻易回答。

【问题讨论】:

  • 更具可读性?以前的孤儿规则(顺便说一句我不知道)? From 预计不会失败,而 try from 预计会出现错误。
  • 关于孤儿规则,以前的版本不允许写 impl,因为 FromResult 都没有在你的 crate 中定义。但是现在这对于Result&lt;Foo,_&gt; 被允许的情况放宽了,只要您在箱子中定义Foo。检查blog.rust-lang.org/2020/01/30/Rust-1.41.0.html

标签: rust


【解决方案1】:

TryFrom 中,错误是一个关联类型——它由Bar 类型修复。 From 不是这种情况,实际上您可以为不止一种错误类型实现From。除非您打算这样做(这很奇怪),否则您应该坚持使用TryFrom

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多