结构间共享的方法
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()
}
}
这里是 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()
}
}