【问题标题】:Is it possible to use functions on Rust's constant generics是否可以在 Rust 的常量泛型上使用函数
【发布时间】:2021-06-11 17:24:11
【问题描述】:

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

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 可以在编译时评估某些表达式,这只是不允许这样做的情况,还是我遗漏了什么?

【问题讨论】:

    标签: rust typechecking const-generics


    【解决方案1】:

    当我尝试编译这段代码时,rust 编译器变得非常疯狂。 [...] 我知道 rust 可以在编译时评估一些表达式,这只是不允许这样做的情况,还是我遗漏了什么?

    你说编译器生你的气,但你有没有考虑听它告诉你什么?

    将你的代码插入到 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 中当前启用的是

    常量泛型 MVP

    MVP,如最小可行产品,也就是可能有用的最小功能集,转换为explained in the introductory blog post

    第一个限制是

    const泛型只允许整数类型

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

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

    什么是复杂的泛型表达式?任何以外的东西:

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

    您尝试执行的操作不起作用(除了 both const_genericsconst_evaluatable_checked 启用的 nightly 之外),因为您正在编写涉及至少一个通用参数的常量表达式,不是 MVP 的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-01
      • 1970-01-01
      • 2013-11-05
      • 1970-01-01
      相关资源
      最近更新 更多