我正在尝试在枚举上实现Iterator
,以便在每个.next()
调用之间切换变体。我想重用一些每个变体共有的数据,方法是将它分配给新分配的枚举值。
在下面的示例中,我想在每个方法调用上切换E::A
和E::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
?