Какие ?? двойные вопросительные знаки в Dart?

86

В следующей строке кода есть два вопросительных знака:

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

В чем смысл?

Suragch
источник

Ответы:

173

Оператор с ??двойным вопросительным знаком означает «если ноль». Возьмем, к примеру, следующее выражение.

String a = b ?? 'hello';

Это означает aравно b, но если bравно нулю, то aравно 'hello'.

Другой связанный оператор - ??=. Например:

b ??= 'hello';

Это означает, что если bимеет значение null, установите его равным hello. В противном случае не меняйте его.

Справка

термины

В новостях о выпуске Dart 1.12 в совокупности упоминаются следующие операторы с нулевым значением :

  • ?? - если нулевой оператор
  • ??= - присвоение с нулевым учетом
  • x?.p - нулевой доступ
  • x?.m() - вызов метода с нулевым значением
Suragch
источник
3
Интересно почему ??? а не?:, это вводит в заблуждение тех, кто пришел с PHP, как ?? в PHP означает полностью противоположное.
Ведмант
1
@Vedmant вероятно , потому , что ?уже используется оператор троичного: String a = b == true ? 'x' : 'y';. Который оператор if-null оказывается просто сокращением для тернарной проверки на null, например String a = a == null ? 'hello : a;.
Бруно Фингер
1
@BrunoFinger ?используется для тернарного оператора точно так же в PHP, и есть ярлыки, например, вместо того, чтобы $a = $b === true ? $b : 'y'вы могли ввести $a = $b === true ?: 'y'или вместо $a = $b === true ? 'x' : $b-$a = $b === true ?? 'x'
Vedmant
|| было бы яснее imo
Ced