结构之间共享的方法

jay*_*elm 7 struct traits rust

Rust的新手,为我的天真道歉.

我想定义一些概率分布,它们显然具有不同的参数.但是"界面"(我在Java中所知)应该是相同的.在最基本的层面上,每个分布都应该有sample一个sample_many方法.所以我实现了一个特征:

pub trait ERP<T> {
    fn sample(&self) -> T;
    fn sample_many(&self, i: isize) -> Vec<T>;
}
Run Code Online (Sandbox Code Playgroud)

然后可以创建特定的分布:

pub struct Bernoulli {
    pub p: f64
}

impl ERP<bool> for Bernoulli {
    fn sample(&self) -> bool {
        rand::random::<f64>() < self.p
    }

    fn sample_many(&self, i: isize) -> Vec<bool> {
        (0..i).map(|_| self.sample()).collect()
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是sample_many具体的方法.无论分布的类型如何,该方法都是相同的代码

pub struct Gaussian {
    pub mu: f64,
    pub sigma: f64
}

impl ERP<f64> for Gaussian {
    fn sample(&self) -> f64 {
        // Code unique to each distribution
    }

    fn sample_many(&self, i: isize) -> Vec<f64> {
        (0..i).map(|_| self.sample()).collect() // Code reuse??
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在这里复制方法是非常多余的.有没有解决的办法?

oli*_*obk 8

您可以为特征定义中的任何函数创建默认实现.它仍然可以被实现者覆盖

pub trait ERP<T> {
    fn sample(&self) -> T;
    fn sample_many(&self, i: isize) -> Vec<T> {
        (0..i).map(|_| self.sample()).collect()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果“sample_many”需要访问 strut 字段怎么办? (3认同)