rust - 我应该为二维数组使用什么类型?

标签 rust

这里a的类型有什么问题?

fn foo(a: &[&[f64]], x: &[f64]) {
    for i in 0..3 {
        for j in 0..4 {
            println!("{}", a[i][j]);
        }
    }
}

fn main() {
    let A: [[f64; 4]; 3] = [
        [1.1, -0.2, 0.1, 1.6],
        [0.1, -1.2, -0.2, 2.3],
        [0.2, -0.1, 1.1, 1.5],
    ];
    let mut X: [f64; 3] = [0.0; 3];

    foo(&A, &X);
}

编译失败:

error[E0308]: mismatched types
  --> src/main.rs:17:9
   |
17 |     foo(&A, &X);
   |         ^^ expected slice, found array of 3 elements
   |
   = note: expected type `&[&[f64]]`
              found type `&[[f64; 4]; 3]`

最佳答案

数组 是不同于切片 的类型。值得注意的是,数组具有固定大小,在编译时已知。切片具有固定大小,但仅在运行时已知

我在这里看到两个直接的选择(参见 Levans answer for another )。第一个是将您的函数更改为仅接受对数组的引用(或整个数组,如果您可以复制它或不介意放弃所有权):

fn foo(a: &[[f64; 4]; 3], x: &[f64; 3]) {
    for i in 0..3 {
        for j in 0..4 {
            println!("{}", a[i][j]);
        }
    }
}

fn main() {
    let a = [
        [1.1, -0.2, 0.1, 1.6],
        [0.1, -1.2, -0.2, 2.3],
        [0.2, -0.1, 1.1, 1.5],
    ];

    let x = [0.0; 3];

    foo(&a, &x);
}

另一个简单的改变是将你的声明变成引用:

fn foo(a: &[&[f64]], x: &[f64]) {
    for i in 0..3 {
        for j in 0..4 {
            println!("{}", a[i][j]);
        }
    }
}

fn main() {
    let a = [
        &[1.1, -0.2, 0.1, 1.6][..],
        &[0.1, -1.2, -0.2, 2.3][..],
        &[0.2, -0.1, 1.1, 1.5][..],
    ];

    let x = [0.0; 3];

    foo(&a, &x);
}

请注意,在第二个示例中,当我们只传入 &a&x 时,我们可以使用对数组的引用的隐式强制转换为切片。但是,对于 a 中的嵌套数据,我们不能依赖它。 a 已经被定义为数组的数组,我们不能改变元素类型。

还有一个警告 - 你真的应该在你的范围内使用切片的长度方法,否则你很容易 panic !如果你走到尽头。

fn foo(a: &[&[f64]], x: &[f64]) {
    for i in 0..a.len() {
        let z = &a[i];
        for j in 0..z.len() {
            println!("{}", z[j]);
        }
    }
}

我为满足 Rust 风格所做的其他风格更改:

  1. 变量是snake_case
  2. 后的空格:
  3. 后面的空格;
  4. 周围的空间=
  5. 后面的空格,

关于rust - 我应该为二维数组使用什么类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523895/

相关文章:

rust - 当值包含键和值之间的分隔符或对之间的分隔符时,如何从字符串中提取键和值?

macros - 当内部宏接受参数时,如何定义一个定义另一个宏的宏?

rust - Rust 中的内置对象

rust - 为什么我需要在比较变量时取消引用变量而不是在进行算术运算时?

rust - 为什么在可变引用上调用方法涉及 "borrowing"?

dynamic - 如何在actix_web/rust的http响应中流式传输非静态字节?

rust - 打印!打印 2 位整数

generics - 通用函数和 async_trait 的困难

generics - 为什么 Box<T> 的特征实现与 Fn() 冲突?

rust - 如何将 RangeInclusive 转换为范围?