【发布时间】:2018-06-07 11:44:54
【问题描述】:
我正在尝试接收一些输入,然后如果该值有效则返回该值,如果无效则再次获取输入。但是,我遇到了借用检查器问题,试图检查值并返回它(Rust 的新手)。这是sn-p的代码:
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 模式?我怎样才能让它工作?
【问题讨论】:
-
仅供参考,这是九人莫里斯的实现(因此提到了球员和移动)。可以查看完整代码here。
-
有趣的事情:你知道一个叫做借用检查器的东西,但你不知道它是什么? :) 你应该重新阅读 rust 书,尤其是所有权章节。
-
How to prevent a value from being moved? 的可能重复项在您的情况下,您已经将
self作为参考;您需要做的就是参考mv。 -
阅读rust book,你再也不用问这个问题了~这是必读的
-
我一直在读 Rust 书,但是在业余工作等方面玩弄它意味着我忘记了一些东西。在我看来,一旦该方法完成了价值,它就会放弃所有权 - 显然你需要我没有意识到的参考!
标签: rust