Anda dapat memberikan nilai default untuk struct Anda dengan menerapkan Default
sifat tersebut. The default
fungsi akan terlihat seperti Anda saat ini new
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 membuat instance struct dengan hanya memberikan nilai non-default:
let p = cParams { iInsertMax: 10, ..Default::default() };
Dengan beberapa perubahan kecil pada struktur data Anda, Anda dapat memanfaatkan implementasi default yang diturunkan secara otomatis. Jika Anda menggunakan #[derive(Default)]
pada struktur data, kompilator akan secara otomatis membuat fungsi default untuk Anda yang mengisi setiap bidang dengan nilai defaultnya. Nilai boolean default salah, nilai integral default adalah 0.
Nilai default bilangan bulat menjadi 0 adalah masalah di sini karena Anda ingin bidang bilangan bulat menjadi -1 secara default. Anda bisa mendefinisikan tipe baru yang mengimplementasikan nilai default -1 dan menggunakannya sebagai ganti i64
di struct Anda. (Saya belum mengujinya, tetapi seharusnya berhasil).
Namun, saya menyarankan untuk sedikit mengubah struktur dan penggunaan data Anda Option<i64>
daripada i64
. Saya tidak tahu konteks kode Anda, tetapi sepertinya Anda menggunakan nilai khusus -1 untuk mewakili arti khusus "tak terbatas", atau "tidak ada maks". Di Rust, kami menggunakan Option
untuk mewakili nilai sekarang secara opsional. Tidak perlu meretas -1. Sebuah opsi dapat berupa salah satu None
atau di Some(x)
mana x akan menjadi milik Anda di i64
sini. Bahkan mungkin bilangan bulat unsigned jika -1 adalah satu-satunya nilai negatif. Nilai defaultnya Option
adalah None
, jadi dengan perubahan yang diajukan, kode Anda akan 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() };