Что выведет код Senior Dart: классы и миксины обновлено

Dart: sealed-класс и switch с деструктуризацией

Вопрос

Что выведет программа? По строке на каждый вывод.

sealed class Shape {}

class Circle extends Shape {
  final double r;
  Circle(this.r);
}

class Rect extends Shape {
  final double w, h;
  Rect(this.w, this.h);
}

String describe(Shape s) => switch (s) {
      Circle(r: 0) => 'точка',
      Circle(:final r) => 'круг $r',
      Rect(:final w, :final h) when w == h => 'квадрат $w',
      Rect(:final w, :final h) => 'прямоугольник ${w * h}',
    };

void main() {
  for (final s in [Circle(0), Circle(2), Rect(3, 3), Rect(2, 5)]) {
    print(describe(s));
  }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: точка, круг 2.0, квадрат 3.0, прямоугольник 10.0. Объектный паттерн Circle(r: 0) сравнивает поле с константой, :final r достаёт поле в переменную.

Что выведет

точка
круг 2.0
квадрат 3.0
прямоугольник 10.0

Разбор

Объектный паттерн Circle(r: 0) сравнивает поле с константой, :final r достаёт поле в переменную. Ветки проверяются по порядку, guard when уточняет условие. Поля типа double, поэтому 2 печатается как 2.0. Ветки _ не нужно: Shape sealed, и компилятор знает, что подтипов только два.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме