Мутирование себя в методе enum - PullRequest
0 голосов
/ 02 мая 2018

Это сделано вместе, чтобы проиллюстрировать проблему, с которой я столкнулся при использовании функции switch. У меня нет проблем с печатью «Влево» и «Вправо» бесконечно.

Смысл switch - поменять значение enum на другое. Это решение не работает, потому что предположительно switch перемещает t в себя, так что его больше нельзя использовать. Использование изменяемых ссылок вызывает целый ряд других проблем, таких как время жизни и несовпадающие типы. В документации были инструкции, как это сделать с структурами, но не перечисления Компилятор предложил реализовать перечисления Copy и Clone, но это ничего не дало.

Как этот тип метода должен быть сделан в 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 голосов
/ 02 мая 2018

Ваш метод потребляет ваши данные, а не заимствует их. Если вы позаимствуете его, он прекрасно работает:

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