You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:37:47