2012-11-07 5 views

risposta

39

Dart ha due tipi di parametri facoltativi: denominati e posizionali. Prima di discutere le differenze, vorrei prima discutere le somiglianze.

I parametri facoltativi di Dart sono facoltativo in quanto il chiamante non è obbligato a specificare un valore per il parametro quando chiama la funzione.

I parametri facoltativi possono essere dichiarati solo dopo qualsiasi parametro richiesto.

I parametri facoltativi possono avere un valore predefinito, che viene utilizzato quando un chiamante non specifica un valore.

parametri facoltativi posizionali

Un parametro avvolto da [ ] è un parametro facoltativo posizionale. Ecco un esempio:

getHttpUrl(String server, String path, [int port=80]) { 
    // ... 
} 

Nel codice di cui sopra, port è facoltativo e ha un valore di default di 80.

È possibile chiamare getHttpUrl con o senza il terzo parametro.

getHttpUrl('example.com', '/index.html', 8080); // port == 8080 
getHttpUrl('example.com', '/index.html');  // port == 80 

È possibile specificare più parametri posizionali per una funzione:

getHttpUrl(String server, String path, [int port=80, int numRetries=3]) { 
    // ... 
} 

I parametri opzionali sono posizionale in quanto non è possibile omettere port se si desidera specificare numRetries.

getHttpUrl('example.com', '/index.html'); 
getHttpUrl('example.com', '/index.html', 8080); 
getHttpUrl('example.com', '/index.html', 8080, 5); 

Naturalmente, se non sai cosa 8080 e 5 sono, è difficile dire che cosa quei numeri apparentemente magici sono. È possibile utilizzare con nome parametri facoltativi per creare API più leggibili.

parametri opzionali denominati

Un parametro avvolto da { } è un parametro opzionale di nome. Ecco un esempio:

getHttpUrl(String server, String path, {int port: 80}) { 
    // ... 
} 

È possibile chiamare getHttpUrl con o senza il terzo parametro. deve utilizzare il nome del parametro quando si chiama la funzione.

getHttpUrl('example.com', '/index.html', port: 8080); // port == 8080 
getHttpUrl('example.com', '/index.html');    // port == 80 

È possibile specificare più parametri denominati per una funzione:

getHttpUrl(String server, String path, {int port: 80, int numRetries: 3}) { 
    // ... 
} 

Perché parametri denominati si fa riferimento al nome, possono essere utilizzati in un ordine diverso da loro dichiarazione.

getHttpUrl('example.com', '/index.html'); 
getHttpUrl('example.com', '/index.html', port: 8080); 
getHttpUrl('example.com', '/index.html', port: 8080, numRetries: 5); 
getHttpUrl('example.com', '/index.html', numRetries: 5, port: 8080); 
getHttpUrl('example.com', '/index.html', numRetries: 5); 

Credo parametri denominati fanno per i siti delle chiamate più facili da capire, soprattutto quando ci sono le bandiere booleani o numeri out-of-context.

Verificando parametro opzionale è stato fornito

Purtroppo, non è possibile distinguere tra i casi "un parametro opzionale non è stata fornita" e "un parametro opzionale è stato fornito con il valore di default".

Nota: È possibile utilizzare parametri opzionali posizionali o parametri opzionali denominati, ma non entrambi nella stessa funzione o il metodo. Quanto segue non è permesso.

thisFunctionWontWork(String foo, [String positonal], {String named}) { 
    // will not work! 
} 
+4

? l'operatore è stato deprecato. Ho trovato solo la scala == condizione nulla nel tutorial dart. (expr1? expr2: expr3 funziona ancora) –

+0

Amare i parametri multipli nominati per una funzione, questo era difficile da trovare! Guarderebbe ancora meglio nella parte dei costruttori di documenti? ;) – willsquire

+0

I valori di default dovrebbero ora essere specificati con '=' invece di ':', secondo https://www.dartlang.org/guides/language/language-tour#optional-positional-parameters. – nbro