关联常量

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. }