为什么关联的常量不依赖于类型参数?

时间:2015-06-08 09:36:58

标签: rust

这仅仅是当前的限制还是有技术原因?由于泛型函数被编译为专用代码,我看不出应该阻止它工作的内容。它在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);    
}

1 个答案:

答案 0 :(得分:6)

简短回答:它尚未实施,因为很难做到正确。甚至还有一个名为“Constants that depend on type parameters in generic code”的开放式RFC。

答案很长:

以前是compiler-bug that caused the compiler to crash。 @quantheory在PR 25091中通过使这个错误而不是崩溃来“修复”它。 @quantheory评论说

  

我还没有能够处理相关争用的数组大小或递归问题,但我希望我对范围匹配模式所做的更改也可能有助于数组大小。

@quantheory还指出,这将保持错误,直到合并RFC 1062的某些内容。关于RFC的评论总是受到赞赏,因为他们可能会忘记用例。