假设我有一个枚举:
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它本身?
我认为在这种情况下您真正想要的是实现该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)