我如何"添加"对flatten()
的{{1}}方法,只有在Option<U>
为U
的情况下才会进行类型检查,或者更简单地将其添加到Option<T>
?天真地,我正在尝试编写以下内容,但不编译:
Option<Option<T>>
答案 0 :(得分:5)
由于连贯性,你不能把固有的实现(你正在尝试的)写入你没有定义的类型(如果可以,你怎么知道某人 else 还没有定义了一个名为flatten
的东西?)。
相反,您需要使用所需的方法定义和实现特征。无论您想要什么方法,都可以使用特征:
trait Flatten<T> {
fn flatten(self) -> Option<T>;
}
impl<T> Flatten<T> for Option<Option<T>> {
fn flatten(self) -> Option<T> {
match self {
None => None,
Some(v) => v,
}
}
}
fn main() {
let x = Some(Some(1));
let y = x.flatten();
println!("{:?}", y);
}
另请注意,我将方法的主题从&self
更改为self
:您无法退出借用(尤其不是不可变的)所以通过引用来self
在这里没有意义。