我可以做到这一点:
let a: [f32; 3] = [0.0, 1.0, 2.0];
为什么这不起作用呢?
let a: [f32; _] = [0.0, 1.0, 2.0];
在我看来,指定长度似乎是冗余且无足轻重的。有没有一种方法可以避免必须显式地指定它?(而且不必将f32
附加到所有字面值上。)
我可以做到这一点:
let a: [f32; 3] = [0.0, 1.0, 2.0];
为什么这不起作用呢?
let a: [f32; _] = [0.0, 1.0, 2.0];
在我看来,指定长度似乎是冗余且无足轻重的。有没有一种方法可以避免必须显式地指定它?(而且不必将f32
附加到所有字面值上。)
_
只能用于两个上下文环境中:在模式(patterns)中,匹配要忽略的值;作为类型(type)的占位符。在数组类型中,长度不是类型(type),而是一个表达式,_
不能用于表达式中。
但你可以将f32
附加到其中一个字面量(literals)中并完全省略类型(type)。由于数组的所有项必须具有相同的类型,编译器将为该数组推断出正确的元素类型。
let a = [0.0f32, 1.0, 2.0];
现在在夜间版本中可以通过 generic_arg_infer
特性实现类型和初始化器的通用参数推断。
#![feature(generic_arg_infer)]
let _arr: [f32; _] = [0.0, 1.0, 2.0];
let _arr: [f32; 3] = [0.0; _];
macro_rules! arr {
($id: ident $name: ident: [$ty: ty; _] = $value: expr) => {
$id $name: [$ty; $value.len()] = $value;
}
}
用法
arr!(static BYTES: [u8; _] = *b"foo");
arr!(let floats: [f32; _] = [0., 1.]);
$value
进行两次评估。 - Chayim Friedman$value
进行两次评估。 - undefined$value
成为一个数组类型的长度,所以 $value
必须是 const
,而且我认为这意味着我们不必担心多次评估。 - Jack O'Connorstatic FOO: &[f32] = &[0.0, 1.0, 2.0];
static FOO: &[f32] = &[3.0, ...];
。 - Lukas Kalbertodtconst
。但是,如果您需要将切片本身放在静态内存中(即,如果您需要一个&'static &[f32]
),则需要另外考虑。 - bluss