2016-12-12 67 views
8

Pas, mevcut bir yapıyı kullanabileceğiniz ve yalnızca bazı üyelerini geçersiz kılabileceğiniz kullanışlı bir özelliktir.Yalnızca bazı üyelerin başka bir yapıdan değer kullanabileceği bir yapı nasıl bildirilir?

new_tool = SomeTool { 
    unique_id: "tool.foobar".to_string(), 
    exec: Some(foobar_exec) 
    .. SomeTool::default() 
}; 

I SomeTool beyan isterler açıkça liste zorunda kalmadan: Örneğin, aşağıdaki yapı

struct SomeTool { 
    pub unique_id: String, 
    pub poll: Option<fn(&Context) -> bool>, 
    pub exec: Option<fn(&mut Context) -> ToolResult>, 
    pub modal: Option<fn(&mut Context) -> ToolResult>, 
    pub ui: Option<fn(&mut UIPanel)>, 
} 

bir değeri (örneğin SomeTool::default()) bir yapı örneği geçirilerek başlatıldı edilebilir Her geri arama (gelecekte yeni geri aramaların eklenmesi, bir kod tabanının her yerinde None'un birçok eklenmesine neden olabilir).

Bu iyi çalışıyor, ancak başka bir başlatma için yanlışlıkla unique_id'u dışarıda bırakabiliyordum ve default'da ne varsa onu kullanırdım.

Bazı üyelerin geçersiz kılınabileceği ancak başkalarının yüklenemeyebileceği bir yapı tanımlamanın bir yolu var mı? gerçek dünya kullanımının durum daha bundan daha üyelerini (daha yüksek kazaların şansı yapma) sahip olduğunu


Not sadece soru için basitleştirilmiş.

cevap

8

unique_id ürününüzün benzersiz olması gerektiği için, bir Default yapıcısına sahip olmamalıdır. Ancak Default impl'yi bir hipotetik UniqueId türünden kaldırırsanız, SomeTool için Default türetemezsiniz.

Şu anda çalışan çözüm, bir alt yapıya değer gerektirmeyen tüm alanları taşımak ve SomeTool için Default uygulamamaktır. şöyle Böylece SomeTool kullanmak mümkün olurdu: Pas bir baz ifadesi olarak aynı alanlara sahip iki yapılar olmasına izin verir gelecekte, içeri diye varsayımsal özelliği yoktur

new_tool = SomeTool { 
    unique_id: "tool.foobar".to_string(), 
    callbacks: Callbacks { 
     exec: Some(foobar_exec), 
     .. Callbacks::default() 
    } 
}; 

yapı ifadesi. Bu özellik, alt-yapının ve SomeTool'un ortak olduğu tüm alanları başlatmak için alt yapıyı kullanmanıza izin verir, ancak daha fazlasını değil.