结构间共享的方法

Methods shared among structs

这里是 Rust 的新手,为我的天真道歉。

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

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

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

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()
    }
}

我的问题特别是 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??
    }
}

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

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

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