在枚举方法中改变自我

时间:2018-05-02 10:51:35

标签: enums rust self

这是拼凑在一起,以说明我对switch函数的问题。我没有印刷问题" Left" "右"无休止。

switch的要点是将枚举值换成另一个值。这个解决方案不起作用,因为大概switcht移动到自身,因此它不再可用。使用可变引用会导致许多其他问题,例如生命周期和类型不匹配。该文档说明了如何使用结构,而不是枚举。编译器建议对枚举实现CopyClone,但这没有任何用处。

这种方法应该如何在Rust中生成?

fn main() {
    let mut t = Dir::Left;

    loop {
        match &t {
            &Dir::Left => println!("Left"),
            &Dir::Right => println!("Right"),
        }

        t.switch();
    }
}

enum Dir {
    Left,
    Right,
}

impl Dir {
    //this function is the problem here
    fn switch(mut self) {
        match self {
            Dir::Left => self = Dir::Right,
            Dir::Right => self = Dir::Left,
        };
    }
}

当然我可以这样做

t = t.switch();

fn switch(mut self) -> Self {
    match self {
        Dir::Left  => return Dir::Right,
        Dir::Right => return Dir::Left,
    };
}

但我觉得这将是比较笨拙的解决方案,如果可能的话我想避免它。

1 个答案:

答案 0 :(得分:3)

您的方法会消耗您的数据而不是借用它。如果你借用它,它可以正常工作:

impl Dir {
    fn switch(&mut self) {
        *self = match *self {
            Dir::Left => Dir::Right,
            Dir::Right => Dir::Left,
        };
    }
}