通过associated_consts
功能,你像这样可以定义常量:
#![feature(associated_consts)]
trait Foo {
const ID: i32;
}
impl Foo for i32 {
const ID: i32 = 1;
}
fn main() {
assert_eq!(1, i32::ID);
}
任何Foo
的定义都必须定义ID
,不定义的话:
#![feature(associated_consts)]
trait Foo {
const ID: i32;
}
impl Foo for i32 {
}
会给出
error: not all trait items implemented, missing: `ID` [E0046]
impl Foo for i32 {
}
也可以实现一个默认值:
#![feature(associated_consts)]
trait Foo {
const ID: i32 = 1;
}
impl Foo for i32 {
}
impl Foo for i64 {
const ID: i32 = 5;
}
fn main() {
assert_eq!(1, i32::ID);
assert_eq!(5, i64::ID);
}
如你所见,当实现Foo
时,你可以不实现它(关联常量),当作为i32
时。接着它将会使用默认值。不过,作为i64
时,我们可以增加我们自己的定义。
关联常量并不一定要关联在一个 trait 上。一个struct
的impl
块或enum
也行:
#![feature(associated_consts)]
struct Foo;
impl Foo {
const FOO: u32 = 3;
}