【发布时间】:2020-01-25 09:51:54
【问题描述】:
我可以这样做:
let a: [f32; 3] = [0.0, 1.0, 2.0];
但是为什么这不起作用呢?
let a: [f32; _] = [0.0, 1.0, 2.0];
在我看来,长度是多余的,而且推断起来微不足道。有没有办法避免必须明确指定它? (并且不必将 f32 附加到所有文字。)
【问题讨论】:
标签: rust
我可以这样做:
let a: [f32; 3] = [0.0, 1.0, 2.0];
但是为什么这不起作用呢?
let a: [f32; _] = [0.0, 1.0, 2.0];
在我看来,长度是多余的,而且推断起来微不足道。有没有办法避免必须明确指定它? (并且不必将 f32 附加到所有文字。)
【问题讨论】:
标签: rust
_ 只能在两种情况下使用:在模式中,匹配要忽略的值,以及作为类型的占位符。在数组类型中,长度不是类型,而是表达式,表达式中不能使用_。
但是,您可以做的是将f32 仅附加到其中一个文字并完全省略类型。由于数组的所有项都必须具有相同的类型,因此编译器会为数组推断出正确的元素类型。
let a = [0.0f32, 1.0, 2.0];
【讨论】:
static FOO: &[f32] = &[3.0, ...];
const,除非您需要将切片本身放在静态内存中(即,如果您需要&'static &[f32])。
从 1.39 开始,可以使用简单的宏
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.]);
【讨论】: