Qual è la differenza tra i parametri nominati e posizionali in Dart?


147

Dart supporta sia parametri opzionali nominati sia parametri opzionali posizionali. Quali sono le differenze tra i due?

Inoltre, come si può sapere se è stato effettivamente specificato un parametro opzionale?

Risposte:


273

Il dardo ha due tipi di parametri opzionali: denominato e posizionale . Prima di discutere delle differenze, vorrei prima discutere delle somiglianze.

I parametri opzionali di Dart sono opzionali in quanto al chiamante non è richiesto di specificare un valore per il parametro quando si chiama la funzione.

I parametri opzionali possono essere dichiarati solo dopo tutti i parametri richiesti.

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

Parametri opzionali posizionali

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

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

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

Puoi chiamare getHttpUrlcon 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 posizionali in quanto non è possibile omettere portse si desidera specificare numRetries.

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

Naturalmente, a meno che tu non sappia cosa sono 8080 e 5, è difficile dire quali siano quei numeri apparentemente magici. È possibile utilizzare parametri facoltativi denominati per creare API più leggibili.

Nominati parametri opzionali

Un parametro racchiuso da { }è un parametro facoltativo denominato. Ecco un esempio:

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

Puoi chiamare getHttpUrlcon o senza il terzo parametro. È necessario 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 con nome per una funzione:

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

Poiché i parametri denominati sono referenziati per nome, possono essere utilizzati in un ordine diverso dalla 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 che i parametri nominati rendano i siti di chiamata più facili da capire, specialmente quando ci sono flag booleani o numeri fuori contesto.

Verifica se è stato fornito un parametro facoltativo

Sfortunatamente, non è possibile distinguere tra i casi "non è stato fornito un parametro facoltativo" e "è stato fornito un parametro facoltativo con il valore predefinito".

Nota: è possibile utilizzare parametri facoltativi posizionali o parametri facoltativi denominati, ma non entrambi nella stessa funzione o metodo. Non è consentito quanto segue.

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

4
? l'operatore è stato deprecato. Ho trovato solo scale == condizione nulla nel tutorial dardo. (expr1? expr2: expr3 funziona ancora)
Zdeněk Mlčoch

1
Amando i parametri nominati multipli per una funzione, questo è stato difficile da trovare! Avrebbe un aspetto ancora migliore nella parte dei costruttori dei documenti? ;)
willsquire il

1
I valori predefiniti dovrebbero ora essere specificati con =anziché anziché :, secondo dartlang.org/guides/language/… .
nbro,

31

In Dart con la mia comprensione, il parametro del metodo può essere dato in due tipi.

  • Parametro richiesto
  • Parametro opzionale (posizionale, denominato e predefinito)

>> Parametro richiesto

Il parametro richiesto è un parametro ben noto di vecchio stile che tutti conosciamo

esempio :

findVolume(int length, int breath, int height) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);

produzione:

length = 10, breath = 20, height = 30

>> Parametro posizionale opzionale

il parametro verrà divulgato con parentesi quadre [] e i parametri tra parentesi quadre sono facoltativi.

esempio:

findVolume(int length, int breath, [int height]) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,30);//valid
findVolume(10,20);//also valid

produzione:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null // no value passed so height is null

>> Parametro denominato facoltativo

  • il parametro sarà divulgato con parentesi graffa {}
  • i parametri tra parentesi graffe sono facoltativi.
  • devi usare il nome del parametro per assegnare un valore separato da colan :
  • nell'ordine dei parametri tra parentesi graffe non importa
  • questi parametri di tipo ci aiutano a evitare confusione mentre passano valori per una funzione che ha molti parametri.

esempio:

findVolume(int length, int breath, {int height}) {
 print('length = $length, breath = $breath, height = $height');
}

findVolume(10,20,height:30);//valid & we can see the parameter name is mentioned here.
findVolume(10,20);//also valid

produzione:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = null

>> Parametro predefinito opzionale

  • lo stesso del parametro facoltativo denominato inoltre possiamo assegnare il valore predefinito per questo parametro.
  • il che significa che non viene passato alcun valore, verrà utilizzato questo valore predefinito.

esempio:

findVolume(int length, int breath, {int height=10}) {
 print('length = $length, breath = $breath, height = $height');
} 

findVolume(10,20,height:30);//valid
findVolume(10,20);//valid 

produzione:

length = 10, breath = 20, height = 30
length = 10, breath = 20, height = 10 // default value 10 is taken

grazie per la chiara spiegazione fornita da questo collegamento video, ringraziamenti al creatore del video.

collegamento video: OptionalPositionalParameters

collegamento video: OptionalNamedParameters

collegamento video: OptionalDefaultParameters


3

Quando il parametro di una funzione viene specificato utilizzando la sintassi "paramName: value", si tratta di un parametro denominato. Tali parametri possono essere resi opzionali racchiudendoli tra parentesi [e]. Una dimostrazione rudimentale di questa funzione può essere dimostrata nel seguente programma Hello World:

sayHello([String name = ' World!']) {
  print('Hello, ${name}');
}

void main() {
  sayHello('Govind');
}

2

Da doc otteniamo che entrambi positionaled namedi parametri sono opzionali, il che significa che tutti possono essere assenti.

Secondo me, i namedparametri sono più severi di positionalquelli. Ad esempio, se dichiari tale metodo:

String say({String from, String msg})

Sopra frome msgsono namedparametri, quando si chiama il metodo sayè necessario utilizzare say(from: "xx", msg: "xx"). Le chiavi non possono essere assenti.

Tuttavia, se si utilizzano parametri posizionali, si è liberi.


Il documento dice:> I parametri opzionali possono essere nominati o posizionali, ma non entrambi. Dove dice che i parametri posizionali sono opzionali?
Markon,

Un parametro posizionale è lo stile predefinito dei parametri nei linguaggi di programmazione, chiamato posizionale perché "è il primo parametro, o il secondo, ecc.". Namedi parametri sono chiamati in questo modo perché puoi effettivamente identificarli per nome e non per posizione (se cambi la posizione di due parametri nominati, non importa). Vedi la risposta sopra da Savaranaraja
Markon,

0

Parametri posizionali:

Sono gli stessi dei parametri predefiniti. Per esempio:

void add(int x, [int y = 3]);

Qui y ha il valore predefinito di 3

Parametri nominati:

Questi sono parametri che possono essere passati in qualsiasi ordine passando il nome del parametro seguito dal valore passato. Per esempio:

void sum({int num1, int num2});

Questa funzione si chiama così:

sum(num1: 12, num2: 24);

Anche i parametri con nome possono avere valori predefiniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.