Что выведет код 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 ошибок.