是否可以在 Rust 的常量泛型上使用函数

Jav*_*ine 0 typechecking rust const-generics

假设我正在为数组编写一个包装类型。

struct Array<const L: usize, T> {
    raw: [T;L]
}
Run Code Online (Sandbox Code Playgroud)

我有一些函数可以改变数组包装器的长度,假设该函数是串联:

impl<const L: usize, T> Array<L, T> {
    fn concat<const L2: usize>(self, other: Array<L, T>) -> Array<{L + L2}, T> {todo!();}
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译这段代码时,rust 编译器变得非常疯狂。认为这可能与添加与实现多个特征相对应的类型有关,我尝试使用乘法而不是加法,但这也不起作用。

我知道 Rust 可以在编译时计算某些表达式,这只是不允许的情况,还是我遗漏了一些东西?

Mas*_*inn 7

\n

当我尝试编译这段代码时,rust 编译器变得非常疯狂。[\xe2\x80\xa6] 我知道 rust 可以在编译时计算某些表达式,这只是不允许的情况,还是我遗漏了一些东西?

\n
\n

你说编译器对你很生气,但是你有没有考虑过倾听它告诉你的内容?

\n

将您的代码插入游乐场,第一个错误是一个微不足道的错误

\n
error: type parameters must be declared prior to const parameters\n --> src/lib.rs:1:30\n  |\n1 | struct Array<const L: usize, T> {\n  |             -----------------^- help: reorder the parameters: lifetimes, then types, then consts: `<T, const L: usize>\n
Run Code Online (Sandbox Code Playgroud)\n

所以这似乎不是因为修复起来很简单。

\n

现在解决这个问题,我们进入问题的实质:

\n
  = help: const parameters may only be used as standalone arguments, i.e. `L`\n  = help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions\n
Run Code Online (Sandbox Code Playgroud)\n

这似乎解释了整个事情:Rust 目前启用的是

\n
\n

常量泛型 MVP

\n
\n

MVP 在最小可行产品中也被称为有用的最小功能集,其含义在介绍性博客文章中进行了解释

\n

第一个限制是

\n
\n

const 泛型仅允许整型

\n
\n

这在这里很好,因为您使用的是整数类型,但第二个限制是

\n
\n

cons 参数中没有复杂的泛型表达式

\n
\n

什么是复杂的通用表达式?任何超出以下范围的内容:

\n
\n
    \n
  • 一个独立的常量参数。
  • \n
  • 文字(即整数、布尔值或字符)。
  • \n
  • 具体的常量表达式(用 {} 括起来),不涉及泛型参数。
  • \n
\n
\n

您尝试做的事情不起作用(除了每晚同时启用 const_generics启用const_evaluatable_checked),因为您正在编写涉及至少一个泛型参数的常量表达式,而该泛型参数不是 MVP 的一部分。

\n