这是拼凑在一起,以说明我对switch
函数的问题。我没有印刷问题" Left" "右"无休止。
switch
的要点是将枚举值换成另一个值。这个解决方案不起作用,因为大概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,
};
}
但我觉得这将是比较笨拙的解决方案,如果可能的话我想避免它。
答案 0 :(得分:3)
您的方法会消耗您的数据而不是借用它。如果你借用它,它可以正常工作:
impl Dir {
fn switch(&mut self) {
*self = match *self {
Dir::Left => Dir::Right,
Dir::Right => Dir::Left,
};
}
}