Struct 结构之间共享的方法

Struct 结构之间共享的方法,struct,rust,traits,Struct,Rust,Traits,刚开始生锈,为我的天真道歉 我想定义一些概率分布,它们显然有不同的参数。但是“接口”(正如我在Java中所知道的)应该是相同的。在最基本的层面上,每个发行版都应该有一个sample和一个sample\u many方法。所以我实现了一个特征: pub trait ERP<T> { fn sample(&self) -> T; fn sample_many(&self, i: isize) -> Vec<T>; } 所以在这里复制

刚开始生锈,为我的天真道歉

我想定义一些概率分布,它们显然有不同的参数。但是“接口”(正如我在Java中所知道的)应该是相同的。在最基本的层面上,每个发行版都应该有一个
sample
和一个
sample\u many
方法。所以我实现了一个特征:

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

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

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

pub trait ERP<T> {
    fn sample(&self) -> T;
    fn sample_many(&self, i: isize) -> Vec<T> {
        (0..i).map(|_| self.sample()).collect()
    }
}
ERP{
fn样本(自身)->T;
fn示例\u许多(&self,i:isize)->Vec{
(0..i).map(| | self.sample()).collect()
}
}

@ker我的目的不是创建一个可编译的示例,而是为一个可概括的问题创建一个示例,因此在
Gaussian
中省略
sample
,rust的
未实现!()
宏用于此类情况。您的代码将被编译,但不会执行任何有用的操作。您可以在非常相似的代码中看到这一点,有时实现宏是有意义的。不过,我认为@ker的默认实现在这里最合适。(请参阅宏问题:)如果有许多示例需要访问支柱字段,该怎么办?
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()
    }
}