2015-07-02 20 views
7

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ı?

+0

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

+0

pas sahiptir ' Bu tür durumlar için (!) makro düzeltilmemiş. Kodunuz derlenecek, ancak hiçbir işe yaramayacak. Bunu http://is.gd/WwsBW2 –

+0

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

cevap

8

Özellik tanımındaki herhangi bir işlev için varsayılan bir uygulama oluşturabilirsiniz. Bu Benim niyet bir Derlenebilir örnek oluşturmak için değildi @ker hala Bir Uygulatıcı

pub trait ERP<T> { 
    fn sample(&self) -> T; 
    fn sample_many(&self, i: isize) -> Vec<T> { 
     (0..i).map(|_| self.sample()).collect() 
    } 
} 
+0

Bu çok kolay, teşekkürler! – jayelm

İlgili konular