是否可以声明没有明确长度的数组?

ide*_*n42 1 arrays rust

在 Rust 中,您可以声明一个具有特定大小的数组:

struct Vector(f64, f64);

fn main() {
    let points: [Vector; 3] = [
        Vector(1.0, 1.0), 
        Vector(5.0, 5.0), 
        Vector(0.0, 0.0),
    ];

    println!("Length is {}\n", points.len());
}
Run Code Online (Sandbox Code Playgroud)

有没有办法让长度(3在本例中)是隐式的,因为数组中有 3 个元素。与 C 中的操作类似:

struct Vector(f64, f64);

fn main() {
    let points: [Vector; 3] = [
        Vector(1.0, 1.0), 
        Vector(5.0, 5.0), 
        Vector(0.0, 0.0),
    ];

    println!("Length is {}\n", points.len());
}
Run Code Online (Sandbox Code Playgroud)

请注意,这绝对是一个初学者问题。

Mat*_* M. 5

从 Rust 1.10 开始,根据一系列快速测试,答案是否定的:

let points              = [ ... ]; // OK
let points: [_     ; 3] = [ ... ]; // OK
let points: [Vector; _] = [ ... ]; // REJECTED
let points: [Vector; 3] = [ ... ]; // OK
Run Code Online (Sandbox Code Playgroud)

在 Rust 中,_这是要求编译器为您填补空白的简单方法。不幸的是,它不被接受,而不是3:编译器相当严厉地抱怨它需要一个表达式。

这可能并不奇怪,因为目前数组是一种特殊情况:Rust 泛型还不允许使用非类型泛型参数,因此数组的编译器“黑客”是有限的,这是可以理解的。

对于好奇的人来说,确切的错误是:

let points              = [ ... ]; // OK
let points: [_     ; 3] = [ ... ]; // OK
let points: [Vector; _] = [ ... ]; // REJECTED
let points: [Vector; 3] = [ ... ]; // OK
Run Code Online (Sandbox Code Playgroud)

注意:现在等待其他人证明我错了:)