这只是当前的限制还是技术原因?随着泛型函数被编译成专门的代码,我看不出什么应该阻止它工作.它在main函数中也可以正常工作.

示例(playground):

#![feature(associated_consts)]
trait HasNumber<T> {
    const Number: usize;
}

enum One {}
enum Two {}

enum Foo {}

impl<T> HasNumber<One> for T {
    const Number: usize = 1;
}

impl<T> HasNumber<Two> for T {
    const Number: usize = 2;
}

fn use_number<T, H: HasNumber<T>>() {
    let a: [u8; H::Number] = unsafe { ::std::mem::uninitialized() };
}

fn main() {
    let a: [u8; <Foo as HasNumber<One>>::Number] = unsafe { ::std::mem::uninitialized() };
    println!("{}", <Foo as HasNumber<One>>::Number); 
    println!("{}", <Foo as HasNumber<Two>>::Number);    
}

推荐答案

简短的回答:由于很难做到正确,所以还没有实施.甚至还有一个名为"Constants that depend on type parameters in generic code"的开放RFC.

详细回答:

这曾经是compiler-bug that caused the compiler to crash美元.PR 25091年,@quantheory将其"修复"为一个错误,而不是崩溃@量子理论 comments 说

我还不能处理数组大小或相关常量的递归问题,尽管我希望我对范围匹配模式所做的更改也能帮助处理数组大小.

@量子理论还指出,这将一直是一个错误,直到沿着RFC 1062线的东西被合并.对RFC的 comments 总是值得赞赏的,因为它们可能会导致被遗忘的用例.

Rust相关问答推荐

什么是谓词的简短和简洁类型

空字符串转换为Box字符串时是否分配?<>

访问Rust中的隐藏变量

如何获取Serde struct 的默认实例

从Type::new()调用函数

如何点击()迭代器?

Tokio_Postgres行上未显示退回特性的生存期,且生命周期 不够长

无法将 rust 蚀向量附加到另一个向量

使用 select 处理 SIGINT 和子等待!无阻塞

Rust 中的静态引用

提取指向特征函数的原始指针

Rust: 目标成员属于哪个"目标家族"的列表是否存在?

缺失serde的字段无法设置为默认值

如何展平以下嵌套的 if let 和 if 语句?

SDL2 没有在终端键上触发?

TinyVec 如何与 Vec 大小相同?

如何制作具有关联类型的特征的类型擦除版本?

如何在不设置精度的情况下打印浮点数时保持尾随零?

在 Rust 中组合特征的不同方法是否等效?

为什么可以从不可变 struct 的字段中移动?