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!
}
? l'operatore è stato deprecato. Ho trovato solo la scala == condizione nulla nel tutorial dart. (expr1? expr2: expr3 funziona ancora) –
Amare i parametri multipli nominati per una funzione, questo era difficile da trovare! Guarderebbe ancora meglio nella parte dei costruttori di documenti? ;) – willsquire
I valori di default dovrebbero ora essere specificati con '=' invece di ':', secondo https://www.dartlang.org/guides/language/language-tour#optional-positional-parameters. – nbro