Rust中[_; N]语法的数组长度N允许使用哪些表达式?
Rust数组
[_; N]语法中允许的长度表达式 在Rust里,数组的长度N必须是编译期就能确定值的常量表达式,结合你给出的示例,具体合法的情况有这些:
- 字面量整数:比如
[T::BAR; 3]里的3,这种直接写数字的方式肯定没问题,编译期一眼就能确定长度。 - 全局定义的
const变量:就像示例里的FOOBAR,这类const变量在编译时就会被求值为固定数值,所以用来当数组长度完全合法,比如[1; FOOBAR]能正常运行。 - 具体类型的关联常量:如果是某个确定类型实现的trait关联常量,比如
Fubar::BAR(你示例里Fubar实现了Foo trait的BAR常量),直接用这个具体类型的关联常量当长度是可以的——你可以试试写[1; Fubar::BAR],它肯定能编译通过。
为啥示例里[1; T::BAR]会报错?
这是因为T是泛型参数,虽然它被约束为实现Foo trait,但编译器没法保证所有实现Foo的类型的BAR值都是一样的。举个例子,要是我再写个这样的类型:
struct AnotherFoo(); impl Foo for AnotherFoo { const BAR: usize = 5; }
当调用Baz::<AnotherFoo>::print_bar()时,数组长度就变成5了,而之前Baz::<Fubar>的数组长度是3——在Rust里,数组的长度是它类型的一部分,同一个泛型函数不能同时生成两种不同长度的数组类型,所以编译器直接就报错了。
说白了,能当数组长度的表达式,必须让编译器在编译阶段就锁定唯一的数值,不能是那种在不同泛型实例化时可能变的东西。
内容的提问来源于stack exchange,提问作者Jonas Greitemann
相关产品推荐
相关产品推荐

