jenerik kurucusu için açık bir ek açıklama C kütüphanesi için bir Rust ciltleme yazıyorum. Farklı kaynak varlıklardan oluşturulabilecek, muhtemelen bazı referansları dahili olarak kaydedebilen bir varlık uygular. Pas türünün güvenli bir mülkiyet politikasını zorunlu kılmasını istiyorum. Bu nedenle, sarıcı yapı, saklı referansın türüne göre parametrelenmiş, geneldir. Genel tip
struct Foobar<T> {
origin: T,
}
Sonra benim
Foobar
türü için bazı oluşturucular uygulamak.
Ve işte problem geliyor: hem yapı hem de yapıcı bağımsız olarak parametreleniyor. Yapıcı tipi parametresi argümanlarından çıkarılabilirken, yapı tipi parametresi yapıcıda kullanılmaz ve çıkarım edilemez. Böylece, naif yolu, kurucuların
let a = Foobar::from_nowhere();
let b = Foobar::from_orange(&mut fruit);
let c = Foobar::from_callback(|x| x*x);
aramaya karıştırır rustc:
rustgen.rs:43:13: 43:33 error: unable to infer enough type information about `_`; type annotations required [E0282]
rustgen.rs:43 let a = Foobar::from_nowhere();
Bazı keyfi türü parametresi sağlayarak düzeltilebilir:
let a = Foobar::<()>::from_nowhere();
let b = Foobar::<()>::from_orange(&mut fruit);
let c = Foobar::<()>::from_callback(|x| x*x);
... hepsi bu çirkin çeşitler. Sorunu çözmenin bir başka yolu, kurucuları serbest fonksiyonlara dönüştürmek olacaktır, ancak bu (kinda) ideolojik değildir.
Soru şu ki, bir şey mi eksik? Tasarım bir şekilde kusurlu gibi görünüyor. Sadece bir seviyedeki jenerikle kurtulmak için bu tipin tasarlanmasının uygun yolu ne olurdu? Başvuru için
Minimal reproducible example on Rust playpen
, benim derleyici sürümü:
Anladığım kadarıyla$ rustc --version
rustc 1.1.0-dev (built 2015-04-26)
Teşekkür ederiz! Fark etmediğim şey, farklı parametreler için çoklu 'impl' cümlelerinin olması olabilirdi. –