Con el feature associated_consts
, puedes definir constantes como:
#![feature(associated_consts)] trait Foo { const ID: i32; } impl Foo for i32 { const ID: i32 = 1; } fn main() { assert_eq!(1, i32::ID); }
Cualquier implementador de Foo
tendrá que definir ID
. Sin la definición:
#![feature(associated_consts)] trait Foo { const ID: i32; } impl Foo for i32 { }
resulta en
error: not all trait items implemented, missing: `ID` [E0046]
impl Foo for i32 {
}
Un valor por defecto puede también ser implementado:
#![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); }#![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); }
Como puedes ver, al implementar Foo
, puedes dejarlo sin implementación, como en el caso de i32
. Entonces este usara el valor por defecto. Pero, también y al igual que como en i64
, podemos agregar nuestra propia definición.
Las constantes asociadas no necesitan solo funcionan con traits. Un bloque impl
para una struct
o un enum
es también valido:
#![feature(associated_consts)] struct Foo; impl Foo { const FOO: u32 = 3; }