我有一个特点叫Sleep:
pub trait Sleep {
fn sleep(&self);
}
Run Code Online (Sandbox Code Playgroud)
我可以Bed为每个结构提供不同的实现,但事实证明大多数人以很少的方式睡觉.你可以睡在床上:
pub trait HasBed {
fn sleep_in_bed(&self);
fn jump_on_bed(&self);
}
impl Sleep for HasBed {
fn sleep(&self) {
self.sleep_in_bed()
}
}
Run Code Online (Sandbox Code Playgroud)
如果你露营,你可以睡在帐篷里:
pub trait HasTent {
fn sleep_in_tent(&self);
fn hide_in_tent(&self);
}
impl Sleep for HasTent {
fn sleep(&self) {
self.sleep_in_tent()
}
}
Run Code Online (Sandbox Code Playgroud)
有一些古怪的案例.我有一个可以靠墙站着睡觉的朋友,但大多数人大多数时候会陷入一些简单的情况.
我们定义一些结构并让它们Sleep:
struct Jim;
impl HasBed for Jim {
fn sleep_in_bed(&self) {}
fn jump_on_bed(&self) {}
}
struct Jane;
impl HasTent for Jane {
fn …Run Code Online (Sandbox Code Playgroud) 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 {
// …Run Code Online (Sandbox Code Playgroud)