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() };
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). –@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
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. –