Rust 默认值的通用实现中可能存在的错误?

Rust 默认值的通用实现中可能存在的错误?,rust,traits,Rust,Traits,给定以下派生默认值的结构Foo: #[derive(Default)] struct Foo<T> { bar: Option<T>, } #[派生(默认)] 结构Foo{ 酒吧:选择, } 这是为什么 fn create<T>() -> Foo<T> { Foo { bar: Option::default(), } } fn create()->Foo{ 福{ bar:Option::defa

给定以下派生
默认值的结构
Foo

#[derive(Default)]
struct Foo<T> {
    bar: Option<T>,
}
#[派生(默认)]
结构Foo{
酒吧:选择,
}
这是为什么

fn create<T>() -> Foo<T> {
    Foo {
        bar: Option::default(),
    }
}
fn create()->Foo{
福{
bar:Option::default(),
}
}
但这不是吗

fn create_alt<T>() -> Foo<T> {
    Foo::default()
}
fn创建_alt()->Foo{
Foo::default()
}
在我看来,它们都在做完全相同的事情——
t
是否实现
Default
(这是编译器希望我指定的)应该无关紧要,因为
Option
实现
Default


是指向此示例的Rust游乐场的链接。

这是一个已知问题,很难修复

简而言之,
#[派生]
使用了不正确的界限:它假设为了实现
Foo
Default
T
必须是
Default
,而实际上
选项:Default
就足够了

修复它的问题是可能有私有类型的结构成员,并且在具有私有成员的公共泛型结构上使用
#[派生]
可能会部分公开该私有接口。比如说,

trait MyTrait {}

struct MyType<T> {}

impl<T> Default for MyType<T> where T: MyTrait {}

#[derive(Default)]
pub struct PubType<T> {
    member: MyType<T>,
}

现在解决这个问题的最好方法可能是避免在这种情况下使用
#[派生]
,自己编写
impl

注意,这会发生在其他几个自动派生的特性上,包括
调试
默认
克隆
,可能还有更多。派生实现要求所有类型参数也实现它们。
impl Default for PubType<T>
    where T: MyTrait
{ ... }