如何在 Rust 中实现 Option<U> 的 From<T> ?

Erd*_*ray 3 rust

假设我有一个枚举:

enum Foo {
    A,
    B,
}
Run Code Online (Sandbox Code Playgroud)

...我想实现这样的事情:

impl From<char> for Option<Foo> {
    fn from(chr: char) -> Self {
        match chr {
            'A' => Some(Foo::A),
            'B' => Some(Foo::B),
            _ => None,
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

目前这是非法的,因为Option它是从我自己的板条箱中取出的,它的所有者是std. 编译器错误是:

only traits defined in the current crate can be implemented for types defined outside of the crate
define and implement a trait or new type instead rustc(E0117)
Run Code Online (Sandbox Code Playgroud)

正如我上面所示的情况,在某些情况下,我希望而None不是Some. 有没有一种方法可以实现From我能够获得的Option<U>而不是U它本身?


环境

  • 铁锈1.62.1

orl*_*rlp 8

我认为在这种情况下您真正想要的是实现该TryFrom特征。

例如(理想情况下你应该创建一个正确的Error类型而不是 a str):

impl TryFrom<char> for Foo {
    type Error = &'static str;

    fn try_from(chr: char) -> Result<Foo, Self::Error> {
        match chr {
            'A' => Ok(Foo::A),
            'B' => Ok(Foo::B),
            _ => Err("can't convert character to Foo"),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)