是否可以在 Rust 的常量泛型上使用函数
Is it possible to use functions on Rust's constant generics
假设我正在为数组编写一个包装器类型。
struct Array<const L: usize, T> {
raw: [T;L]
}
我有一些函数可以改变数组包装器的长度,假设该函数是连接:
impl<const L: usize, T> Array<L, T> {
fn concat<const L2: usize>(self, other: Array<L, T>) -> Array<{L + L2}, T> {todo!();}
}
当我尝试编译这段代码时,rust 编译器变得非常疯狂。认为这可能与添加对应于实现多个特征的类型有关,我尝试了乘法而不是加法,这也没有用。
我知道 Rust 可以在编译时计算一些表达式,这只是不允许这样做的情况,还是我遗漏了什么?
When I try to compile this code, the rust compiler gets extremely mad. […] I know that rust can evaluate some expressions at compile time, is this just a case where that isn't allowed, or am I missing something?
你说编译器生你的气,但你有没有考虑过听它告诉你什么?
将您的代码插入 playground,第一个错误是
的一个小错误
error: type parameters must be declared prior to const parameters
--> src/lib.rs:1:30
|
1 | struct Array<const L: usize, T> {
| -----------------^- help: reorder the parameters: lifetimes, then types, then consts: `<T, const L: usize>
所以它似乎不是,因为修复起来很简单。
现在解决了问题的实质:
= help: const parameters may only be used as standalone arguments, i.e. `L`
= help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions
这似乎解释了事情的全部:目前在 Rust 中启用的是
Const generics MVP
MVP,如 最小可行产品,也就是可能有用的最小功能集,转化为 explained in the introductory blog post。
第一个限制是
Only integral types are permitted for const generics
这里很好,因为您使用的是整型,但第二个限制是
No complex generic expressions in const arguments
什么是复杂的通用表达式?以下任何内容:
- A standalone const parameter.
- A literal (i.e. an integer, bool, or character).
- A concrete constant expression (enclosed by {}), involving no generic parameters.
你试图做的事情不起作用(除了 both const_generics
和 const_evaluatable_checked
启用的 nightly 之外)因为你正在写常量包含至少一个通用参数的表达式,它不是 MVP 的一部分。
假设我正在为数组编写一个包装器类型。
struct Array<const L: usize, T> {
raw: [T;L]
}
我有一些函数可以改变数组包装器的长度,假设该函数是连接:
impl<const L: usize, T> Array<L, T> {
fn concat<const L2: usize>(self, other: Array<L, T>) -> Array<{L + L2}, T> {todo!();}
}
当我尝试编译这段代码时,rust 编译器变得非常疯狂。认为这可能与添加对应于实现多个特征的类型有关,我尝试了乘法而不是加法,这也没有用。
我知道 Rust 可以在编译时计算一些表达式,这只是不允许这样做的情况,还是我遗漏了什么?
When I try to compile this code, the rust compiler gets extremely mad. […] I know that rust can evaluate some expressions at compile time, is this just a case where that isn't allowed, or am I missing something?
你说编译器生你的气,但你有没有考虑过听它告诉你什么?
将您的代码插入 playground,第一个错误是
的一个小错误error: type parameters must be declared prior to const parameters
--> src/lib.rs:1:30
|
1 | struct Array<const L: usize, T> {
| -----------------^- help: reorder the parameters: lifetimes, then types, then consts: `<T, const L: usize>
所以它似乎不是,因为修复起来很简单。
现在解决了问题的实质:
= help: const parameters may only be used as standalone arguments, i.e. `L`
= help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions
这似乎解释了事情的全部:目前在 Rust 中启用的是
Const generics MVP
MVP,如 最小可行产品,也就是可能有用的最小功能集,转化为 explained in the introductory blog post。
第一个限制是
Only integral types are permitted for const generics
这里很好,因为您使用的是整型,但第二个限制是
No complex generic expressions in const arguments
什么是复杂的通用表达式?以下任何内容:
- A standalone const parameter.
- A literal (i.e. an integer, bool, or character).
- A concrete constant expression (enclosed by {}), involving no generic parameters.
你试图做的事情不起作用(除了 both const_generics
和 const_evaluatable_checked
启用的 nightly 之外)因为你正在写常量包含至少一个通用参数的表达式,它不是 MVP 的一部分。