Rust的新手,为我的天真道歉。
我想定义一些概率分布,它们显然具有不同的参数。但是“界面”(我在Java中所知)应该是相同的。在最基本的级别,每个分发都应该有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??
}
}
方法,具体而言。无论分布的类型如何,此方法都是相同的代码,例如
Update MyTable Set MyField = Left(MyField, 255);
所以在这里复制方法非常多余。有办法解决这个问题吗?
答案 0 :(得分:8)
您可以为特征定义中的任何函数创建默认实现。它仍然可以被实现者覆盖
pub trait ERP<T> {
fn sample(&self) -> T;
fn sample_many(&self, i: isize) -> Vec<T> {
(0..i).map(|_| self.sample()).collect()
}
}