Puoi fornire valori predefiniti per la tua struttura implementando il Default
tratto. La default
funzione sarebbe simile alla tua new
funzione attuale :
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
È quindi possibile istanziare la struttura fornendo solo i valori non predefiniti:
let p = cParams { iInsertMax: 10, ..Default::default() };
Con alcune piccole modifiche alla struttura dei dati, è possibile trarre vantaggio da un'implementazione predefinita derivata automaticamente. Se usi #[derive(Default)]
una struttura dati, il compilatore creerà automaticamente una funzione predefinita per te che riempie ogni campo con il suo valore predefinito. Il valore booleano predefinito è false, il valore integrale predefinito è 0.
Il valore predefinito di un intero che è 0 è un problema qui poiché si desidera che i campi interi siano -1 per impostazione predefinita. Potresti definire un nuovo tipo che implementa un valore predefinito di -1 e usarlo invece che i64
nella tua struttura. (Non l'ho testato, ma dovrebbe funzionare).
Tuttavia, suggerirei di modificare leggermente la struttura dei dati e utilizzare Option<i64>
invece di i64
. Non conosco il contesto del tuo codice, ma sembra che tu stia usando il valore speciale di -1 per rappresentare il significato speciale "infinito" o "non c'è massimo". In Rust, usiamo un Option
per rappresentare un valore presente facoltativamente. Non è necessario un hack -1. Un'opzione può essere None
o Some(x)
dove x sarebbe la tua i64
qui. Potrebbe anche essere un numero intero senza segno se -1 fosse l'unico valore negativo. Il Option
valore predefinito è None
, quindi con le modifiche proposte, il codice potrebbe essere simile a questo:
#[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() };