设计模式
在发生改变的枚举中使用mem::{take(_), replace(_)}来保留所有值
Description
假定我们有一个&mut MyEnum,它有(至少)两个变体, A { name: String, x: u8 }和B { name: String }。 现在我们想如果x为零,把MyEnum::A改成B,同时保持MyEnum::B不变。
Example
use std::mem;enum MyEnum {A { name: String, x: u8 },B { name: String }}fn a_to_b(e: &mut MyEnum) {if let MyEnum::A { name, x: 0 } = e {// this takes out our `name` and put in an empty String instead// (note that empty strings don't allocate).// Then, construct the new enum variant (which will// be assigned to `*e`).*e = MyEnum::B { name: mem::take(name) }}}
这也适用于更多的变体:
use std::mem;enum MultiVariateEnum {A { name: String },B { name: String },C,D}fn swizzle(e: &mut MultiVariateEnum) {use MultiVariateEnum::*;*e = match e {// Ownership rules do not allow taking `name` by value, but we cannot// take the value out of a mutable reference, unless we replace it:A { name } => B { name: mem::take(name) },B { name } => A { name: mem::take(name) },C => D,D => C}}