在可变借用枚举的变体之间移动数据

时间:2017-11-02 21:27:52

标签: rust

我正在尝试在枚举上实现Iterator,以便在每个.next()调用之间切换变体。我想重用一些每个变体共有的数据,方法是将它分配给新分配的枚举值。

在下面的示例中,我想在每个方法调用上切换E::AE::B之间的变体,并重用枚举中保存的类似字符串值:

enum E {
    A(String),
    B(String)
}

impl Iterator for E {
    /* ... */

    fn next(&mut self) -> /* ... */ {
        *self = match *self {
            E::A(ref s) => E::B(*s),
            E::B(ref s) => E::A(*s),
        };

        /*...*/
    }
}

但是我收到了关于搬出借来的self成员的错误:

error: cannot move out of borrowed content [E0507]
main.rs:11       E::A(ref s) => E::B(*s),

由于self被原子替换,因此其内容的移出应该在逻辑上合理,但借用检查器不会检测到这一点。

目前我.clone()正在寻找我希望移动的领域,但这很浪费。

我考虑过使用mem::swap,它允许借用内容进行原子交换;但看起来这只有在两个交换位置同时存在时才有效。

我想要什么,而不使用unsafe

0 个答案:

没有答案