O que são as ?? pontos de interrogação duplos no Dart?

96

A seguinte linha de código tem dois pontos de interrogação:

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

Qual é o significado?

Suragch
fonte

Respostas:

192

O ??operador de ponto de interrogação duplo significa "se nulo". Veja a seguinte expressão, por exemplo.

String a = b ?? 'hello';

Isso significa aigual b, mas se bfor nulo, então aigual 'hello'.

Outro operador relacionado é ??=. Por exemplo:

b ??= 'hello';

Isso significa que se bfor nulo, defina-o igual a hello. Caso contrário, não mude.

Referência

Termos

As notícias do lançamento do Dart 1.12 se referem coletivamente aos seguintes como operadores nulos :

  • ?? - operador se nulo
  • ??= - atribuição nulo
  • x?.p - acesso nulo
  • x?.m() - invocação de método com reconhecimento de nulo
Suragch
fonte
3
Interessante porque é ?? e não?:, é bastante enganador para quem vem do PHP, como ?? em PHP significa completamente oposto.
Vedmant
1
@Vedmant provavelmente porque ?já está a ser utilizado pelo operador ternário: String a = b == true ? 'x' : 'y';. Que o operador if-null acaba sendo apenas uma abreviação para uma verificação nula ternária como String a = a == null ? 'hello : a;.
Bruno Finger
1
@BrunoFinger ?é usado para operador ternário da mesma forma no PHP, e existem atalhos como em vez de $a = $b === true ? $b : 'y'você pode digitar $a = $b === true ?: 'y'ou em vez de $a = $b === true ? 'x' : $b-$a = $b === true ?? 'x'
Vedmant
3

O Dart oferece alguns operadores úteis para lidar com valores que podem ser nulos. Um é o operador de atribuição ?? =, que atribui um valor a uma variável apenas se essa variável for atualmente nula:

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

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

Outro operador nulo é ?? , que retorna a expressão à sua esquerda, a menos que o valor dessa expressão seja nulo, caso em que avalia e retorna a expressão à sua direita:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.
Deus oficial
fonte
Você respondeu a um post já respondido há 2 anos para pedir votos positivos?
Arthur Rey