结构之间共享的方法

时间:2015-07-02 13:10:10

标签: struct rust traits

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

我想定义一些概率分布,它们显然具有不同的参数。但是“界面”(我在Java中所知)应该是相同的。在最基本的级别,每个分发都应该有sample_manypub 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?? } } 方法,具体而言。无论分布的类型如何,此方法都是相同的代码,例如

Update MyTable Set MyField = Left(MyField, 255);

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

1 个答案:

答案 0 :(得分:8)

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

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