为什么类型别名不能使用Rust中原始类型的关联常量?

时间:2019-07-01 17:43:03

标签: types rust alias associated-const

我有一个类型别名type CardId = u64;,我想将其初始化为它可以通过std::u64::MAX常量获得的最大数量。得知我不能使用别名做同样的事情,我感到很惊讶。

use std::u64;

type CardId = u64;

fn main() {
    let this_works = u64::MAX;
    let this_doesnt_work = CardId::MAX;

    println!("Max amount in integer: {} and {}", this_works, this_doesnt_work);
}

(Permalink to the playground)

我期望MAX常量也可以从类型别名中访问。当我将类型更改为u32时,这将对我有帮助,这将导致代码有两点需要修改,而不仅仅是类型别名的位置。为什么要做出这个决定,而我是否错过了可能使之成为可能的事情?

2 个答案:

答案 0 :(得分:7)

诸如std::u64::MAX之类的常数不是u64类型的关联常数,而是在称为u64的模块中定义的常数。

这是Rust没有关联常量时的遗产。当前有an RFC opened to deprecate them

执行此操作的“新”方法是使用关联的const方法,这些方法可通过类型别名访问:

use std::u64;

type CardId = u64;

fn main() {
    let this_works = u64::max_value();
    let this_also_work = CardId::max_value();

    println!(
        "Max amount in integer: {} and {}",
        this_works, this_also_work
    );
}

(Permalink to the playground)

也可以通过类型别名访问关联的常量:

struct Foo;

impl Foo {
    const FOO: u32 = 42;
}

type Bar = Foo;

fn main() {
    let this_works = Foo::FOO;
    let this_also_work = Bar::FOO;

    println!("The answer: {} and {}", this_works, this_also_work);
}

(Permalink to the playground)

答案 1 :(得分:6)

这是因为std::u64::MAX是模块常量,而不是类型常量。

如果要与类型别名一起使用,可以使用max_value

use std::u64;

type CardId = u64;

fn main() {
    let this_works = u64::max_value();
    let this_does_work_as_well = CardId::max_value();

    println!("Max amount in integer: {} and {}", this_works, this_does_work_as_well);
}