新类型的 Rust 特征

Alb*_*les 7 traits rust

假设我已经Group通过所有组操作定义了一个特征。是否可以创建一个包装器AGroupGroup无需手动派生其所有操作?

基本上,我想要这个:

#[derive (Copy, Debug, Clone, Eq, PartialEq, Group)] // How could I derive Group here as well?
struct AGroup<G: Group>(G);
Run Code Online (Sandbox Code Playgroud)

没有所有这些样板:

impl<G: Group> Add for AGroup<G>{
    type Output = AGroup<G>;
    fn add(self, other: Self) -> Self {
        AGroup(self.0 + other.0)
    }
}

impl<G: Group> Neg for AGroup<G>{
    type Output = AGroup<G>;
    fn neg(self) -> Self {
        AGroup(-self.0)
    }
}
...
Run Code Online (Sandbox Code Playgroud)

Net*_*ave 1

您还可以创建一个公开内部对象接口的方法:

pub trait Group {
    fn foo(self: &Self){
        println!("Called from group")
    }
}

#[derive (Copy, Debug, Clone, Eq, PartialEq)] // How could I derive Group here as well?
pub struct AGroup<G: Group>(G);

impl<G: Group> AGroup<G> {
    pub fn inner(&self) -> &impl Group {
        &self.0
    }
}

pub struct Test {}
impl Group for Test {}



fn main( ) {
    let a = AGroup( Test {} );
    a.inner().foo();
}
Run Code Online (Sandbox Code Playgroud)

操场


归档时间:

查看次数:

2100 次

最近记录:

4 年,7 月 前