2013-10-29 15 views
46

Nell'esempio seguente, preferirei molto preferire assegnare un valore a ogni campo nella struct nella dichiarazione dei campi. In alternativa, richiede effettivamente un'istruzione aggiuntiva per ogni campo per assegnare un valore ai campi. Tutto quello che voglio essere in grado di fare è assegnare valori predefiniti quando la struttura è istanziata.Esiste un modo più rapido/più breve per inizializzare le variabili in una struttura di Rust?

C'è un modo più succinto di farlo?

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, 
     } 
    } 
} 

risposta

73

È 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 è OptionNone, 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() }; 
+1

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. –

+4

@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

+0

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. –

Problemi correlati