Dot shorthands (сокращения с точкой)

Сокращенная синтаксическая конструкция с точкой .foo позволяет опускать имя типа. Если компилятор может определить целевой тип по контексту, вы сможете писать более лаконичный код Dart. При обращении к значениям перечислений, статическим членам и конструкторам необязательно полностью записывать конструкцию Тип.foo.

Проще говоря: сокращение с точкой допускает выражения, начинающиеся перечисленными ниже формами, после которых можно последовательно вызывать другие операции:

  • Идентификатор .myValue
  • Конструктор .new()
  • Создание константы const .myValue()

Примеры

enum Status { none, running, stopped, paused }

class Point {
  final int x, y;
  Point(this.x, this.y);
  Point.origin() : x = 0, y = 0;
}


void main() {
    // Сокращение для именованного конструктора
    Point origin = .origin(); // Аналогично Point.origin()
  
    // Сокращение для перечисления
	Status currentStatus = .running; // Аналогично Status.running

	// Сокращение статического метода
	int port = .parse('8080'); // Аналогично int.parse('8080')

}Code language: Dart (dart)

Контекстный тип (Context type)

Сокращение с точкой работает благодаряконтекстному типу, позволяя компилятору определять соответствующий член типа.

Контекстный тип — это тип, который Dart ожидает получить в данном месте исходя из расположения выражения.

Пример: Status currentStatus = .running

Компилятор понимает, что переменная должна иметь тип Status, поэтому интерпретирует запись .running как Status.running.

Лексическая структура и синтаксис

Сокращенная запись статических членов — это выражение,начинающееся с символа .. Если контекст однозначно определяет тип, допускается сокращенное обращение к статическим членам, конструкторам и константам перечислений.

Сферы применения

1. Перечисления

При присваивании значений и сопоставлении в операторе switch тип перечисления четко определен, поэтому сокращение подходит идеально:

enum LogLevel { debug, info, warning, error }

String colorCode(LogLevel level) {
  return switch (level) {
    .debug => 'gray',
    .info => 'blue',
    .warning => 'orange',
    .error => 'red',
  };
}

void main() {
   // Вызов функции
   String warnColor = colorCode(.warning); //Автоматически распознается LogLevel.warning
}Code language: Dart (dart)

2. Именованный конструктор / Фабричный конструктор

Поддерживается передача параметров типа конструкторам обобщенных классов:

class Point {
  final double x, y;
  const Point(this.x, this.y);
  const Point.origin() : x = 0, y = 0;

  factory Point.fromList(List<double> list) => Point(list[0], list[1]);
}



void main() {
    Point origin = .origin();
	Point p1 = .fromList([1.0, 2.0]);

	// Обобщенный класс
	List<int> intList = .filled(5, 0); // List.filled(5,0)
}Code language: Dart (dart)

3. Беспараметрический конструктор .new

Конструкция .new позволяет сокращенно вызывать стандартный безымянный конструктор класса. Удобна для массовой инициализации полей в классах состояния, обобщенные параметры определяются автоматически:

// Без сокращения
late final AnimationController _animationController = AnimationController(vsync: this);
final ScrollController _scrollController = ScrollController();

// С сокращением
late final AnimationController _animationController = .new(vsync: this);
final ScrollController _scrollController = .new();
final GlobalKey<ScaffoldMessengerState> scaffoldKey = .new();
Map<String, Map<String, bool>> properties = .new();Code language: Dart (dart)

4 Статические члены (статические методы, статические поля)

int httpPort = .parse('80');        // int.parse('80')
BigInt bigIntZero = .zero;          // BigInt.zeroCode language: Dart (dart)

5 Константные выражения

В контексте констант сокращение можно использовать при условии, что целевой член является константой времени компиляции:

enum Status { none, running }
class Point {
  final double x, y;
  const Point(this.x, this.y);
  const Point.origin() : x = 0.0, y = 0.0;
}

const Status defaultStatus = .running;
const Point myOrigin = .origin();
const List<Point> keyPoints = [.origin(), .new(1.0, 1.0)];Code language: Dart (dart)

Цепочка вызовов

После сокращенной записи можно последовательно вызывать методы и свойства экземпляров. Компилятор сначала определяет цель сокращения по контексту, возвращаемые значения последующих вызовов должны быть совместимы по типу:

String lowerH = .fromCharCode(72).toLowerCase();
// String.fromCharCode(72).toLowerCase()
print(lowerH); // hCode language: JavaScript (javascript)
void main() {
    String lowerH = .fromCharCode(72).toLowerCase();
	// String.fromCharCode(72).toLowerCase()
	print(lowerH); // h
}Code language: Dart (dart)
D:\dartdemo\firstdart>dart run
Building package executable...
Built firstdart:firstdart.
h
Code language: CSS (css)

Dot shorthands (сокращения с точкой)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *