Dalam contoh berikut, saya akan lebih memilih untuk memberikan nilai pada masing-masing bidang dalam struct dalam deklarasi bidang. Atau, secara efektif, mengambil satu pernyataan tambahan untuk masing-masing bidang untuk menetapkan nilai ke ladang. Semua yang saya inginkan untuk dapat lakukan adalah untuk menetapkan nilai-nilai default ketika struct instantiated.
Apakah ada yang lebih ringkas cara untuk melakukan hal ini?
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,
}
}
}
Anda dapat memberikan nilai default untuk anda struct dengan menerapkan Default
dan sifat. Default
fungsi akan terlihat seperti anda saat ini baru
fungsi:
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
Anda kemudian dapat instantiate struct dengan memberikan hanya yang non-default nilai-nilai:
let p = cParams { iInsertMax: 10, ..Default::default() };
Dengan beberapa perubahan kecil untuk struktur data anda, anda dapat mengambil keuntungan dari aplikasi yang secara otomatis berasal implementasi standar. Jika anda menggunakan #[berasal(Default)]
pada struktur data, compiler akan secara otomatis membuat fungsi default untuk anda yang mengisi setiap kolom dengan nilai default. Default nilai boolean false, default nilai integral adalah 0.
Integer's default value menjadi 0 adalah masalah di sini karena anda ingin integer bidang untuk menjadi -1 secara default. Anda bisa menentukan jenis baru yang mengimplementasikan nilai default -1 dan menggunakan yang bukan i64
dalam struct. (Saya belum't diuji itu, tetapi harus bekerja).
Namun, saya'd sarankan untuk sedikit mengubah struktur data dan menggunakan Pilihan<i64>
bukan i64
. Saya don't tahu konteks dari kode anda, namun sepertinya anda're menggunakan khusus nilai -1 untuk mewakili makna khusus "tak terbatas", atau "ada's tidak ada max". Di Rust, kami menggunakan sebuah Pilihan
untuk mewakili opsional nilai sekarang. Ada's tidak perlu untuk -1 hack. Pilihan dapat berupa Tidak
atau C(x)
di mana x akan menjadi i64
di sini. Bahkan mungkin integer unsigned jika -1 adalah satu-satunya nilai negatif. Default Pilihan
value None
, sehingga dengan perubahan yang diusulkan, kode anda bisa terlihat seperti ini:
#[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() };