【问题标题】:How do I check if a value is valid and then return it?如何检查一个值是否有效然后返回它?
【发布时间】: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


【解决方案1】:

当您只是将一个未经修饰的参数(如(String,String))传递给一个函数时,您就是在将值移动到该函数中。你不再拥有它了,你已经把它交给了函数。

您可能只想将参数类型更改为&(String,String) 以传递引用。然后该函数将能够查看数据,但不会发生所有权更改。

【讨论】:

  • 谢谢,这行得通!我将方法签名改为fn move_valid(&self, mv: &(String, String)) -> bool {,并分解了方法内部的元组。现在阅读更多...
猜你喜欢
  • 2016-05-08
  • 2015-01-01
  • 2023-03-21
  • 2021-05-15
  • 1970-01-01
  • 2019-06-27
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多