Quali sono le ?? doppi punti interrogativi in ​​Dart?


96

La seguente riga di codice ha due punti interrogativi:

final myStringList = prefs.getStringList('my_string_list_key') ?? [];

Qual è il significato?

Risposte:


192

L' ??operatore del doppio punto interrogativo significa "se nullo". Prendi la seguente espressione, per esempio.

String a = b ?? 'hello';

Ciò significa auguale b, ma se bè nullo allora è auguale 'hello'.

Un altro operatore correlato è ??=. Per esempio:

b ??= 'hello';

Ciò significa che se bè nullo, impostalo uguale a hello. Altrimenti, non cambiarlo.

Riferimento

Termini

Le notizie sul rilascio di Dart 1.12 si riferiscono collettivamente ai seguenti come operatori null-aware :

  • ?? - se operatore nullo
  • ??= - assegnazione null-aware
  • x?.p - accesso null-aware
  • x?.m() - invocazione del metodo null-aware

3
Interessante perché è ?? e no?:, è abbastanza fuorviante per qualcuno che proviene da PHP, come ?? in PHP significa completamente opposto.
Vedmant

1
@Vedmant probabilmente perché ?è già in uso da parte dell'operatore ternario: String a = b == true ? 'x' : 'y';. Che l'operatore if-null risulta essere solo una scorciatoia per un controllo nullo ternario come String a = a == null ? 'hello : a;.
Bruno Finger

1
@BrunoFinger ?viene utilizzato per l'operatore ternario allo stesso modo in PHP, e ci sono scorciatoie come invece di $a = $b === true ? $b : 'y'poter digitare $a = $b === true ?: 'y'o invece di $a = $b === true ? 'x' : $b-$a = $b === true ?? 'x'
Vedmant

3

Dart offre alcuni utili operatori per gestire valori che potrebbero essere nulli. Uno è l'operatore di assegnazione ?? =, che assegna un valore a una variabile solo se quella variabile è attualmente nulla:

int a; // The initial value of a is null.
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

Un altro operatore null-aware è ?? , che restituisce l'espressione alla sua sinistra a meno che il valore di quell'espressione non sia nullo, nel qual caso valuta e restituisce l'espressione alla sua destra:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.

Hai risposto a un post già risposto 2 anni fa per chiedere voti positivi?
Arthur Rey
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.