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)
所以在这里复制方法是非常多余的.有没有解决的办法?
您可以为特征定义中的任何函数创建默认实现.它仍然可以被实现者覆盖
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)
归档时间: |
|
查看次数: |
302 次 |
最近记录: |