可以在Rust中推断数组长度吗?

Tim*_*mmm 11 rust

我可以做这个:

let a: [f32; 3] = [0.0, 1.0, 2.0];
Run Code Online (Sandbox Code Playgroud)

但为什么这不起作用?

let a: [f32; _] = [0.0, 1.0, 2.0];
Run Code Online (Sandbox Code Playgroud)

在我看来,长度是多余的和微不足道的推断.有没有办法避免必须明确指定它?(而且不必附加f32到所有文字.)

Fra*_*gné 21

_只能在两个上下文中使用:在模式中,匹配要忽略的值,以及作为类型的占位符.在数组类型中,长度不是类型,而是表达式,_不能在表达式中使用.

但是,您可以执行的操作f32仅附加到其中一个文字中,并完全省略该类型.由于数组的所有项必须具有相同的类型,因此编译器将推断出数组的正确元素类型.

let a = [0.0f32, 1.0, 2.0];
Run Code Online (Sandbox Code Playgroud)

  • 如果要处理常量或静态变量(必须指定类型),则通常使用切片类型来代替:`static FOO:&[f32] =&[3.0,...];` (2认同)

Cha*_*man 7

现在可以在每晚使用该generic_arg_infer功能,对于类型和初始化程序:

#![feature(generic_arg_infer)]

let _arr: [f32; _] = [0.0, 1.0, 2.0];
let _arr: [f32; 3] = [0.0; _];
Run Code Online (Sandbox Code Playgroud)


小智 6

从 1.39 开始可以使用简单的宏

macro_rules! arr {
    ($id: ident $name: ident: [$ty: ty; _] = $value: expr) => {
        $id $name: [$ty; $value.len()] = $value;
    }
}
Run Code Online (Sandbox Code Playgroud)

用法

arr!(static BYTES: [u8; _] = *b"foo");
arr!(let floats: [f32; _] = [0., 1.]);
Run Code Online (Sandbox Code Playgroud)