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 可以在编译时计算某些表达式,这只是不允许的情况,还是我遗漏了一些东西?
\n\n当我尝试编译这段代码时,rust 编译器变得非常疯狂。[\xe2\x80\xa6] 我知道 rust 可以在编译时计算某些表达式,这只是不允许的情况,还是我遗漏了一些东西?
\n
你说编译器对你很生气,但是你有没有考虑过倾听它告诉你的内容?
\n将您的代码插入游乐场,第一个错误是一个微不足道的错误
\nerror: 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>\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n这似乎解释了整个事情:Rust 目前启用的是
\n\n\n常量泛型 MVP
\n
MVP 在最小可行产品中也被称为有用的最小功能集,其含义在介绍性博客文章中进行了解释。
\n第一个限制是
\n\n\nconst 泛型仅允许整型
\n
这在这里很好,因为您使用的是整数类型,但第二个限制是
\n\n\ncons 参数中没有复杂的泛型表达式
\n
什么是复杂的通用表达式?任何超出以下范围的内容:
\n\n\n\n
\n- 一个独立的常量参数。
\n- 文字(即整数、布尔值或字符)。
\n- 具体的常量表达式(用 {} 括起来),不涉及泛型参数。
\n
您尝试做的事情不起作用(除了每晚同时启用和 const_generics启用const_evaluatable_checked),因为您正在编写涉及至少一个泛型参数的常量表达式,而该泛型参数不是 MVP 的一部分。
| 归档时间: |
|
| 查看次数: |
1557 次 |
| 最近记录: |