Anda dapat memberikan nilai default untuk struct Anda dengan menerapkan Defaultsifat tersebut. The defaultfungsi akan terlihat seperti Anda saat ini newfungsi:
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 i64di 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 Optionuntuk mewakili nilai sekarang secara opsional. Tidak perlu meretas -1. Sebuah opsi dapat berupa salah satu Noneatau di Some(x)mana x akan menjadi milik Anda di i64sini. Bahkan mungkin bilangan bulat unsigned jika -1 adalah satu-satunya nilai negatif. Nilai defaultnya Optionadalah 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() };