impl TryFrom<Bar> for Foo 与 impl From<Bar> for Result<Foo, ()> 的优缺点是什么?

Ear*_*ine 5 rust

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

struct Foo(i32);
struct Bar;

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

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

struct Foo(i32);
struct Bar;

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

根据这个试验,这两种解决方案似乎同样有效。

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

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

Lam*_*iry 8

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