我正在尝试接收一些输入,然后返回值,如果它有效,或者如果不是则再次输入。但是,我试图通过借用检查器问题来检查值并返回它(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模式?我怎样才能让它发挥作用?
答案 0 :(得分:1)
当您将一个未经修饰的参数(如(String,String)
)传递给函数时,您将值移动到该函数中。你已经不再拥有它了,你已经把它交给了这个职能部门。
您可能只想将参数类型更改为&(String,String)
以传递引用。然后该函数将能够查看数据,但不会发生所有权更改。