Rust 仅当满足类型约束时才有条件地实现生锈特征

Rust 仅当满足类型约束时才有条件地实现生锈特征,rust,generic-programming,Rust,Generic Programming,我有以下结构: pub struct Foo<T> { some_value: T, } impl<T> Foo<T> { pub fn new(value: T) -> Self { Self { some_value: value } } } // Implement `Default()`, assuming that the underlying stored type // `T` also impl

我有以下结构:

pub struct Foo<T> {
    some_value: T,
}

impl<T> Foo<T> {
    pub fn new(value: T) -> Self {
        Self { some_value: value }
    }
}

// Implement `Default()`, assuming that the underlying stored type
// `T` also implements `Default`.
impl<T> Default for Foo<T>
where
    T: Default,
{
    fn default() -> Self {
        Self::new(T::default())
    }
}

您的示例在解决了一些小的语法问题后,确实有效:

pub struct Foo<T> {
    some_value: T,
}

impl<T> Foo<T> {
    pub fn new(value: T) -> Self {
        Self { some_value: value }
    }
}

// Implement `Default()`, assuming that the underlying stored type
// `T` also implements `Default`.
impl<T> Default for Foo<T>
where
    T: Default,
{
    fn default() -> Self {
        Self::new(T::default())
    }
}

fn main() {}
pub struct Foo{
某些值:T,
}
impl-Foo{
发布fn新(值:T)->Self{
Self{some_value:value}
}
}
//实现'Default()`,假设基础存储类型
//'T'还实现了'Default'。
Foo的impl默认值
哪里
T:默认,
{
fn default()->Self{
Self::new(T::default())
}
}
fn main(){}

对于此特定实例,
派生(默认)
提供的实现完全满足您的要求:

#[derive(Default)]
pub struct Foo<T> {
    some_value: T,
}
#[派生(默认)]
pub struct Foo{
某些值:T,
}
另见:


正如@Kornel的回答所指出的,编译器已经有条件地实现了泛型结构的特征

如果
T
满足定义
Default
实现时指定的类型约束,则仅对
struct Foo
实现
trait。在这种情况下,约束被定义为
,其中T:Default
。因此,
Foo
仅在
T
实现
Default
时实现
Default


如上面的
fn main()
示例所示,当
T
未实现
Default
时,使用
Foo
默认实现的任何尝试都会产生编译器错误。

寻求调试帮助的问题(“此代码为什么不工作?”)必须包括所需的行为,一个特定的问题或错误,以及在问题本身中重现它所需的最短代码。-此代码甚至在语法上都不是有效的Rust代码,因此它会因语法错误而失败。此外,您还没有包含完整的错误消息,因此我们不知道您可能遇到了什么错误。@Shepmaster我向您道歉。事后看来,这个问题没有经过深思熟虑。我修正了语法错误,并对问题进行了额外的澄清。我已选择Kornel的帖子作为接受的答案,但也将编辑原始问题帖子,以确认使用我指定的代码确实可行。我已更新了问题,以包括@Kornel答案的额外解释。
#[derive(Default)]
pub struct Foo<T> {
    some_value: T,
}