rust 二维数组类型推导错误:rustc E0282

发布于 2022-09-13 00:02:57 字数 1053 浏览 24 评论 0

我想通过下标访问Vec<Vec<Point>>这样的二维数组map,但是编译器报错了意思是无法推导类型?
我想不通,map[x][y]的类型不就是Point吗?
这是报错内容

error[E0282]: type annotations needed
  --> src/main.rs:34:15
   |
34 |         match map[x][y] {
   |               ^^^^^^ cannot infer type
   |
   = note: type must be known at this point

以下是源码,删除了无关紧要的内容

use rand::prelude::*;

#[derive(Debug, Clone, Copy)]
enum Point {
    Landmine,
    Num(u8),
}

fn init_map(height: u8, weight: u8, mines: u8) {
    let mut rng = thread_rng();
    let mut map: Vec<Vec<Point>> = vec![vec![Point::Num(0); weight.into()]; height.into()];
    // let mut map: [[Point; 30]; 16] = [[Point::Num(0); 30]; 16];

    let mut num = 0;
    while num < mines {
        let x = rng.gen_range(0..height).into();
        let y = rng.gen_range(0..weight).into();

        match map[x][y] {
            Point::Landmine => {}
            Point::Num(_) => {}
        }
    }

}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青丝拂面 2022-09-20 00:02:57

error index 里有这么一句话:

This error indicates that type inference did not result in one unique possible type, and extra information is required. In most cases this can be provided by adding a type annotation. Sometimes you need to specify a generic type parameter manually.

尝试对程序中做出以下修改 play

        println!("{:?}", map[x]);
        // match map[x][y] {
        //     Point::Landmine => {}
        //     Point::Num(_) => {}
        // }

我们发现报错指向的位置变化了:

   Compiling playground v0.0.1 (/playground)
error[E0282]: type annotations needed
  --> src/main.rs:16:13
   |
16 |         let x = rng.gen_range(0..height).into();
   |             ^ consider giving `x` a type

error: aborting due to previous error

For more information about this error, try `rustc --explain E0282`.
error: could not compile `playground`

To learn more, run the command again with --verbose.

因此,该段程序的报错是因为 rng.get_range 的返回值需要指定泛型。给 x, y 加上类型标注,或者
通过 turbo fish 语法 指定返回值的类型 rng.gen_range::<usize>::(0..height),均可修复这个问题。

修复play

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文