Burada Rust için yeni, benim naiveté için özür dilerim.Yapılar arasında paylaşılan yöntemler
Açıkça farklı parametrelere sahip olan bazı olasılık dağılımlarını tanımlamak istiyorum. Ama "arayüz" (Java'da bildiğim gibi) aynı olmalıdır. En temel seviyede, her bir dağıtım bir sample
ve bir sample_many
yöntemine sahip olmalıdır. Özellikle,
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()
}
}
Sorunum sample_many
yöntemi ile geçerli: Ardından belirli dağıtım oluşturulabilir
pub trait ERP<T> {
fn sample(&self) -> T;
fn sample_many(&self, i: isize) -> Vec<T>;
}
: Ben bir özelliği uygular. Bu yöntem, dağıtım türünden bağımsız olarak aynı kod olacaktır, örn.
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??
}
}
Yani burada yöntemini kopyalayarak oldukça gereksiz olduğunu. Bunun etrafında bir yolu var mı?
tarafından üzerine, ama sadece bir örnek, bir genellenebilir sorunu için, dolayısıyla dışarıda bırakarak yapabilirsiniz 'Gaussian'' de sample' – jayelm
pas sahiptir ' Bu tür durumlar için (!) makro düzeltilmemiş. Kodunuz derlenecek, ancak hiçbir işe yaramayacak. Bunu http://is.gd/WwsBW2 –
içinde görebilirsiniz. Çok benzer bir kod için, bazen bir uygulama makrosu mantıklıdır. Yine de, @ ker'in varsayılan uygulamasının burada en uygun olduğunu düşünüyorum. (bkz makro soru: http://stackoverflow.com/questions/31082179/implementing-a-trait-for-a-trait) – jocull