6.10.关联常量

优质
小牛编辑
129浏览
2023-12-01

通过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 上。一个structimpl块或enum也行:

#![feature(associated_consts)]

struct Foo;

impl Foo {
    const FOO: u32 = 3;
}