【问题标题】:Casting &i32 as usize将 &i32 转换为使用大小
【发布时间】:2021-05-30 00:47:37
【问题描述】:

我有一个函数用于在连接 4 中进行移动,该函数需要 3 个参数。主要问题是 square 变量超出了 for 循环的范围,因此必须借用它,但是我不能将 &i32 转换为 usize

fn make_move<'playing>(board: &'playing Vec<&str>, column: i32, turn: &'playing i32) -> &'playing Vec<&'playing str> {
    let mut square = column;
    let new_board = board;

    for i in 0..6 {
        if new_board[(&square) as usize] == " " {
            square = &square + 7;
        } else {
            if turn % 2 == 0 {
                new_board[(&square - 7) as usize] = "●";
            } else {
                new_board[(&square - 7) as usize] = "○";
            }
        }
    }
    return new_board;
}
error[E0606]: casting `&i32` as `usize` is invalid
 --> src/lib.rs:6:22
  |
6 |         if new_board[(&square) as usize] == " " {
  |                      ---------^^^^^^^^^
  |                      |
  |                      cannot cast `&i32` as `usize`
  |                      help: dereference the expression: `*(&square)`

我也刚开始使用 Rust,所以我确信我的逻辑有缺陷,也许这是一个愚蠢的错误,但我们将不胜感激。

【问题讨论】:

    标签: rust


    【解决方案1】:

    在这种情况下,您根本不需要 square 之前的 & 符号。 square是一个i32,它是一个整数类型,你想把它变成另一个整数类型,所以你根本不需要借它。由于i32Copy,您可以毫无问题地制作廉价的square 副本。

    此外,new_board 正在复制您对board 的引用,而不是复制实际的板。 Vec 不是Copy,因为副本并不便宜,所以您需要使用clone 方法创建一个新板,然后返回实际的Vec,而不是参考。通过上述更改和这一更改,结果将如下所示:

    fn make_move<'playing>(
        board: &'playing Vec<&str>,
        column: i32,
        turn: &'playing i32,
    ) -> Vec<&'playing str> {
        let mut square = column;
        let mut new_board = board.clone();
    
        for i in 0..6 {
            if new_board[(square) as usize] == " " {
                square = square + 7;
            } else {
                if turn % 2 == 0 {
                    new_board[(square - 7) as usize] = "●";
                } else {
                    new_board[(square - 7) as usize] = "○";
                }
            }
        }
        return new_board;
    }
    

    或者,您可以将board 设为可变引用,在这种情况下,您将同时修改旧版和​​新版,但您可以继续返回引用。看起来像这样:

    fn make_move<'playing>(
        board: &'playing mut Vec<&str>,
        column: i32,
        turn: &'playing i32,
    ) -> &'playing Vec<&'playing str> {
        let mut square = column;
        let new_board = board;
    
        for i in 0..6 {
            if new_board[(square) as usize] == " " {
                square = square + 7;
            } else {
                if turn % 2 == 0 {
                    new_board[(square - 7) as usize] = "●";
                } else {
                    new_board[(square - 7) as usize] = "○";
                }
            }
        }
        return new_board;
    }
    

    【讨论】:

    • 我不能只在 for 循环内进行复制,因为它使用了移动的值。
    • 您绝对可以复制square,因为它是i32。我提供了一些例子来说明我在说什么。
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 2014-11-07
    • 2021-05-26
    • 1970-01-01
    • 2013-10-17
    相关资源
    最近更新 更多