Jakie są ?? podwójne znaki zapytania w Dart?

86

Poniższy wiersz kodu zawiera dwa znaki zapytania:

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

Jakie jest znaczenie?

Suragch
źródło

Odpowiedzi:

173

Operator ??podwójnego znaku zapytania oznacza „jeśli null”. Weźmy na przykład następujące wyrażenie.

String a = b ?? 'hello';

Oznacza to arówne b, ale jeśli bjest null, to ajest równe 'hello'.

Innym powiązanym operatorem jest ??=. Na przykład:

b ??= 'hello';

Oznacza to, że jeśli bjest null, ustaw je na hello. W przeciwnym razie nie zmieniaj tego.

Odniesienie

Warunki

Dart 1,12 prasowa wspólnie określane dalej jako operatorów zerowych-aware :

  • ?? - jeśli operator jest pusty
  • ??= - przypisanie ze świadomością zerową
  • x?.p - dostęp ze świadomością zerową
  • x?.m() - wywołanie metody uwzględniającej wartość null
Suragch
źródło
3
Ciekawe, dlaczego to ?? a nie?:, jest to dość mylące dla kogoś, kto pochodzi z PHP, ponieważ ?? w PHP oznacza zupełnie odwrotnie.
Vedmant
1
@Vedmant prawdopodobnie dlatego, że ?jest już używany przez operatora potrójnego: String a = b == true ? 'x' : 'y';. Który operator if-null okazuje się być skrótem dla trójskładnikowego sprawdzenia zerowego, takiego jak String a = a == null ? 'hello : a;.
Bruno Finger
1
@BrunoFinger ?jest używany jako operator trójskładnikowy w ten sam sposób w PHP i istnieją skróty, takie jak zamiast tego $a = $b === true ? $b : 'y'można wpisać $a = $b === true ?: 'y'lub zamiast $a = $b === true ? 'x' : $b-$a = $b === true ?? 'x'
Vedmant
|| byłoby jaśniejsze imo
środa