Rust 如何将扩展方法添加到位于不同板条箱中的关联类型的特征?

Rust 如何将扩展方法添加到位于不同板条箱中的关联类型的特征?,rust,traits,Rust,Traits,我试图在另一个板条箱中为一个特征添加一个扩展方法。 此特征具有指定的关联类型 pub trait Test<W> { type Error; fn do_sth(&mut self) -> Result<W, Self::Error>; } 您想要以下内容吗 impl<E> dyn Test<u8, Error = E> { fn use_do_sth(&mut self) -> Result

我试图在另一个板条箱中为一个特征添加一个扩展方法。 此特征具有指定的关联类型

pub trait Test<W> {
    type Error;

    fn do_sth(&mut self) -> Result<W, Self::Error>;
}

您想要以下内容吗

impl<E> dyn Test<u8, Error = E> {
    fn use_do_sth(&mut self) -> Result<u8, E> {
        self.do_sth()
    }
}
impl-dyn测试{
fn使用结果{
做某事
}
}

我是在编译器提示“必须指定关联类型
Error
的值”之后提出这个问题的。

当需要向外部类型添加方法时,唯一的选择是使用扩展特性。这意味着你用你需要的任何方法定义你自己的特质,并根据你需要的类型来实现它


当您需要向实现某些外部特征的所有类型添加方法时,您可以使用相同的模式,但不要直接列出类型,只需使用特征绑定:

使用std::fmt::Debug;
//这是一种扩展特性。
//您可以强制其所有实现者也实现一些外部特征,
//因此,两个特征边界基本上合并为一个。
trait-HelperTrait:Debug{
fn-helper_方法(&mut-self);
}
//这就是“一揽子”实施,
//涵盖所有必要的类型。
T的impl HelperTrait,其中T:Debug{
fn helper_方法(&mut self){
println!(“{:?}”,self);
}
}


正如你所愿,同样的想法也可以应用于任何外部特征。

相关:我很好奇,直接在特征对象上实现某种东西的用例是什么?你将无法以这种方式扩展外部特征(),如果这是你自己的特征,在其上添加方法不是更好吗?@Cerberus这不是我自己的特征,而是外部特征。真正的问题是,将包含此特性的结构作为元素。现在我需要一个helper_方法,它只使用这个元素。但是因为helper\u方法是struct的一部分,而不是trait,所以在调用helper\u方法时,我不能借用其他元素。()您需要添加这个helper_方法,它是您自己的代码吗?你控制这个结构吗?@Cerberus我真的不需要helper_方法,我也可以复制代码。但我想一定有办法做到这一点。是的,我控制结构。
impl<E> dyn Test<u8, Error = E> {
    fn use_do_sth(&mut self) -> Result<u8, E> {
        self.do_sth()
    }
}