• 关联常量

    关联常量

    associated-constants.md


    commit 024aa9a345e92aa1926517c4d9b16bd83e74c10d

    通过associated_consts功能,你像这样可以定义常量:

    1. #![feature(associated_consts)]
    2. trait Foo {
    3. const ID: i32;
    4. }
    5. impl Foo for i32 {
    6. const ID: i32 = 1;
    7. }
    8. fn main() {
    9. assert_eq!(1, i32::ID);
    10. }

    任何Foo的定义都必须定义ID,不定义的话:

    1. #![feature(associated_consts)]
    2. trait Foo {
    3. const ID: i32;
    4. }
    5. impl Foo for i32 {
    6. }

    会给出

    1. error: not all trait items implemented, missing: `ID` [E0046]
    2. impl Foo for i32 {
    3. }

    也可以实现一个默认值:

    1. #![feature(associated_consts)]
    2. trait Foo {
    3. const ID: i32 = 1;
    4. }
    5. impl Foo for i32 {
    6. }
    7. impl Foo for i64 {
    8. const ID: i32 = 5;
    9. }
    10. fn main() {
    11. assert_eq!(1, i32::ID);
    12. assert_eq!(5, i64::ID);
    13. }

    如你所见,当实现Foo时,你可以不实现它(关联常量),当作为i32时。接着它将会使用默认值。不过,作为i64时,我们可以增加我们自己的定义。

    关联常量并不一定要关联在一个 trait 上。一个structimpl块或enum也行:

    1. #![feature(associated_consts)]
    2. struct Foo;
    3. impl Foo {
    4. const FOO: u32 = 3;
    5. }