È possibile fornire i valori di default per la vostra struct implementando la Default
trait. La funzione default
potrebbe apparire come il vostro attuale new
funzione:
impl Default for cParams {
fn default() -> cParams {
cParams {
iInsertMax: -1,
iUpdateMax: -1,
iDeleteMax: -1,
iInstanceMax: -1,
tFirstInstance: false,
tCreateTables: false,
tContinue: false,
}
}
}
È quindi possibile creare un'istanza del struct dando solo i valori non predefiniti:
let p = cParams { iInsertMax: 10, ..Default::default() };
Con alcune piccole modifiche al tuo struttura dei dati, si può trarre vantaggio da un'implementazione predefinita derivata automaticamente. Se si utilizza #[derive(Default)]
su una struttura dati, il compilatore creerà automaticamente una funzione predefinita che riempie ciascun campo con il suo valore predefinito. Il valore booleano predefinito è falso, il valore integrale predefinito è 0.
Il valore predefinito di un intero pari a 0 è un problema qui poiché si desidera che i campi interi siano -1 per impostazione predefinita. È possibile definire un nuovo tipo che implementa un valore predefinito di -1 e utilizzarlo al posto di i64
nella struttura. (Non l'ho provato, ma dovrebbe funzionare).
Tuttavia, suggerirei di modificare leggermente la struttura dei dati e utilizzare Option<i64>
anziché 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'è il massimo". In Rust, utilizziamo un Option
per rappresentare un valore presente facoltativamente. Non c'è bisogno di un -1 hack. Un'opzione può essere None
o Some(x)
dove x sarebbe il tuo i64
qui. Potrebbe anche essere un intero senza segno se -1 fosse l'unico valore negativo. Il valore di default è Option
None
, quindi con le modifiche proposte, il codice potrebbe essere la seguente:
#[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() };
Grazie, ho avuto una lettura veloce, ma io ri-leggere per una migliore comprensione. Le impostazioni predefinite "naturali" che alcune lingue usano, come credo, zero, false, "", ecc., Mi andrebbero bene. Capisco che ci sono implicazioni più ampie del mio piccolo "problema" da risolvere. Capacità di dichiarare per es. "iVal: i64 = 0", risolverebbe i miei bisogni più ampi, ma suppongo che ciò non accadrà. "# [Derivando (Default)]" dovrebbe risolvere la maggior parte dei miei desideri. Non sono sicuro del motivo per cui ho usato -1 nel mio programma di test, ma non è necessario (storico). Sarebbe molto utile (IMHO) essere in grado di assegnare un valore in situ dove il campo è definito. –
@BrianOh, tangenzialmente, i "valori predefiniti per i campi struct" (ad esempio qualcosa come struct Foo {val: i64 = 0} ') sono stati proposti e quindi potrebbero apparire nelle versioni successive. – huon
Sarebbe bene se fosse implementato IMO - "struct foo {....". Ho apportato le modifiche come suggerito da voi, usando la struct come scritto nella mia domanda e con il default. Questo sicuramente mi sta meglio ed è molto più conciso. Non avendo familiarità con la sintassi, un problema minore che avevo non era conoscere la sintassi per TUTTI i valori predefiniti. IE: Ho usato "= cParams {iInsertMax: 10, ..Default :: default()};", ma in realtà voglio che "iInstanceMax" sia anche un valore predefinito. IMO sarebbe preferibile "# [derending (Default)]" far parte della struttura, ma suppongo che l'alternativa si adatti meglio al compilatore. –