我试图接收一些输入,然后返回值,如果它有效或再次输入,如果不是。但是,我正在尝试借用检查器问题,试图检查值并返回它(Rust新增)。这是代码片段:
fn get_move(&self) -> (String, String) {
let player = self.current_player();
let mut mv;
let mut is_valid = false;
loop {
mv = player.make_move();
{
is_valid = self.move_valid(mv);
}
match is_valid {
true => return mv,
_ => continue,
}
}
}
fn move_valid(&self, (_from,_to): (String, String)) -> bool {
false
}
返回错误是
error[E0382]: use of moved value: `mv`
--> src/game.rs:75:32
|
72 | is_valid = self.move_valid(mv);
| -- value moved here
...
75 | true => return mv,
| ^^ value used here after move
|
= note: move occurs because `mv` has type `(std::string::String, std::string::String)`, which does not implement the `Copy` trait
我尝试在self.move_valid
附近添加范围,但是当我尝试返回它时,move_valid
方法似乎仍然拥有mv
。
在值有效之前,是否有重复输入的标准Rust模式?我怎样才能让它发挥作用?
当您将一个未经修饰的参数(如(String,String)
)传递给函数时,您将该值移动到该函数中。你不再拥有它,你已经将它赋予了这个功能。
您可能只想将参数类型更改为&(String,String)
以传递引用。然后该函数将能够查看数据,但不会发生所有权更改。