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