Это сделано вместе, чтобы проиллюстрировать проблему, с которой я столкнулся при использовании функции 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,
};
}
Но я чувствую, что это было бы сравнительно неуклюжим решением, и я бы хотел избежать его, если это вообще возможно.