在Rust,如何&#34;添加&#34; `弄平&#34;选项<option <t>&gt;?

时间:2015-08-28 03:52:11

标签: generics rust

我如何&#34;添加&#34;对flatten()的{​​{1}}方法,只有在Option<U>U的情况下才会进行类型检查,或者更简单地将其添加到Option<T>?天真地,我正在尝试编写以下内容,但不编译:

Option<Option<T>>

1 个答案:

答案 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在这里没有意义。