我有一个类型别名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);
}
我期望MAX
常量也可以从类型别名中访问。当我将类型更改为u32时,这将对我有帮助,这将导致代码有两点需要修改,而不仅仅是类型别名的位置。为什么要做出这个决定,而我是否错过了可能使之成为可能的事情?
答案 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
);
}
也可以通过类型别名访问关联的常量:
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);
}
答案 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);
}