如何为通用结构实现默认值?

Avn*_*arr 3 rust

我有一个通用结构,并希望提供一个具体的默认实现,它也将允许用户覆盖默认字段的值,但我收到编译错误:

struct MyStruct<A, B, C> {
    pub a: A,
    pub b: B,
    pub c: C,
}

impl<A, B, C> MyStruct<A, B, C>
where
    A: Trait1,
    B: Trait2,
    C: Trait3,
{
    pub fn foo() {}
}

trait Trait1 {}
trait Trait2 {}
trait Trait3 {}
Run Code Online (Sandbox Code Playgroud)

我可以MyStruct显式创建以下实例:

struct SomeA();
impl Trait1 for SomeA {}
struct SomeB();
impl Trait2 for SomeB {}
struct SomeC();
impl Trait3 for SomeC {}

let a = SomeA();
let b = SomeB();
let c = SomeC();

let my_struct = MyStruct { a: a, b: b, c: c }; // compiles
Run Code Online (Sandbox Code Playgroud)

现在我想实现Default这也将允许在必要时覆盖具有不同值的特定字段(允许部分默认?)。不确定语法:

impl Default for MyStruct<SomeA, SomeB, SomeC> {
    fn default() -> Self {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

操场

Dan*_*all 5

您可以通过仅实现实现这个Default如果ABC所有实施Default

impl <A, B, C> Default for MyStruct<A, B, C> where A: Default, B: Default, C: Default {
    fn default() -> Self {
        Self {
            a: A::default(),
            b: B::default(),
            c: C::default(),
        }   
    }   
}
Run Code Online (Sandbox Code Playgroud)

  • 值得指出的是,这正是 `#[derive(Default)]` 将为您提供的,因此如果您不需要任何特殊的东西,您可能应该使用 `derive` 而不是手动实现它。 (4认同)