2013-10-29 15 views
46

Aşağıdaki örnekte, alanlardaki bildirimlerde yapıdaki her alana bir değer atamayı tercih ederim. Alternatif olarak, alanlara bir değer atamak için her alan için etkili bir ek ifade alır. Yapabildiğim tek şey yapı yapılandırıldığında varsayılan değerler atamaktır.Pas yapısındaki değişkenleri başlatmak için daha hızlı/kısa yol var mı?

Bunu yapmanın daha özlü bir yolu var mı?

struct cParams { 
    iInsertMax: i64, 
    iUpdateMax: i64, 
    iDeleteMax: i64, 
    iInstanceMax: i64, 
    tFirstInstance: bool, 
    tCreateTables: bool, 
    tContinue: bool, 
} 

impl cParams { 
    fn new() -> cParams { 
     cParams { 
      iInsertMax: -1, 
      iUpdateMax: -1, 
      iDeleteMax: -1, 
      iInstanceMax: -1, 
      tFirstInstance: false, 
      tCreateTables: false, 
      tContinue: false, 
     } 
    } 
} 

cevap

73

Sen Default özelliği uygulayarak yapı için varsayılan değerler sağlayabilir. Verileriniz yapısına bazı küçük değişikliklerle

let p = cParams { iInsertMax: 10, ..Default::default() }; 

sizi: Bu durumda, sadece sigara varsayılan değerler vererek yapı örneğini

impl Default for cParams { 
    fn default() -> cParams { 
     cParams { 
      iInsertMax: -1, 
      iUpdateMax: -1, 
      iDeleteMax: -1, 
      iInstanceMax: -1, 
      tFirstInstance: false, 
      tCreateTables: false, 
      tContinue: false, 
     } 
    } 
} 

: default fonksiyonu mevcut new fonksiyonu gibi görünecektir otomatik olarak türetilen varsayılan uygulamadan yararlanabilir. Bir veri yapısında #[derive(Default)] kullanırsanız, derleyici sizin için her alanı varsayılan değeriyle dolduran bir varsayılan işlevi otomatik olarak oluşturur. Varsayılan boolean değeri false, varsayılan integral değeri 0'dır.

Tamsayı alanlarının varsayılan olarak -1 olmasını istediğinizden, tamsayı varsayılan 0 değeri buradaki bir sorundur. Varsayılan bir -1 değeri uygulayan ve yapınızda i64 yerine bunu kullanan yeni bir tür tanımlayabilirsiniz. (Bunu test etmedim ama işe yaramalı). Ancak, veri yapınızı biraz değiştirmenizi ve i64 yerine Option<i64> kullanmasını öneririm. Kodunuzun bağlamını bilmiyorum, ancak "sonsuz" özel anlamını temsil etmek için -1 değerindeki özel değeri veya "maksimum yok" şeklini kullanıyor gibi görünüyor. Rust'ta, isteğe bağlı olarak mevcut bir değeri temsil etmek için Option kullanırız. -1 hackine gerek yok. Bir seçenek None veya Some(x) olabilir, burada x burada i64'unuz olacaktır. -1 tek negatif değer ise işaretsiz bir tam sayı bile olabilir.

#[derive(Default)] 
struct cParams { 
    iInsertMax: Option<u64>, 
    iUpdateMax: Option<u64>, 
    iDeleteMax: Option<u64>, 
    iInstanceMax: Option<u64>, 
    tFirstInstance: bool, 
    tCreateTables: bool, 
    tContinue: bool, 
} 

let p = cParams { iInsertMax: Some(10), ..Default::default() }; 
+1

Teşekkürler, ben hızlı bir okuma vardı, ama daha iyi anlaşılması için yeniden okumak gerekir: kod aşağıdaki gibi görünebilir önerilen değişikliklerle böylece varsayılan Option değer, None olduğunu. Bazı dillerin sıfır, yanlış, "" vb. Gibi inanıyorum "doğal" varsayılanları bana uyacaktır. Çözmem gereken küçük “problemim” inden daha geniş anlamlar olduğunu anlıyorum. Örn. "iVal: i64 = 0", daha geniş ihtiyaçlarımı çözecek, ama sanırım bu olmayacak. "# [Türetme (Varsayılan)]", isteklerimin çoğunu çözmelidir. Test programımda neden -1 kullandığımı bilmiyorum, ama buna gerek yok (tarihi). Alanın tanımlandığı yerde in situ bir değer atayabilmek çok yararlı olacaktır (IMHO). –

+4

@BrianOh, teğetsel olarak, "yapı alanları için varsayılan değerler" (yani struct foo {val: i64 = 0} 'gibi bir şey) önerilmiştir ve bu nedenle sonraki sürümlerde görünebilir. – huon

+0

IMO - "struct foo {...." uygulanmışsa iyi olur. Sizin tarafınızdan önerilen değişiklikleri yaptığım gibi, sözümdeki yazımı ve varsayılanı kullanarak yapıyorum. Bu kesinlikle bana daha uygun ve çok daha özlü. Sözdizimden haberi olmayan, sahip olduğum küçük bir sorun, TÜM varsayılanların sözdizimini bilmekti. IE: "= cParams {iInsertMax: 10, ..Default :: default()};" kullandım, ancak aslında "iInstanceMax" ın da bir varsayılan olmasını istiyorum. IMO, yapının bir parçası olmak için "# [türetme (Varsayılan)]" için tercih edilebilir, ancak alternatif derleyiciyi daha iyi karşılar. –

İlgili konular