Pull to refresh

Comments 9

Да Introducing Dart 3 alpha

Where records allow you to combine data, patterns can destructure composite data into its constituents. For example, to destructure the return value of geoLocation above (a record consisting of a pair of ints) into two individual int variables, lat and long, you can use a pattern declaration like this:

void main(List<String> arguments) {
  final (lat, long) = geoLocation('Nairobi');
  print('Current location: $lat, $long');
}

Делает ли это код более грязным? Не логичнее было бы сделать упрощённое созданиие классов типа class Location(int lat, int lon) наподобие Котлину?

Отличие в приведении типов. В переменную типа (num, String) можно присвоить тип (int, String), с классами так не сработает. Нужно было бы кучу классов добавлять: Tuple2<A, B>, Tuple3<A, B, C>, ..., вот эти записи по сути оно и есть, только с синтаксическим сахаром.

Самое важное ни где не упомянуто - это работает только в альфа 3.0

В Dart же записи могут иметь только позиционные параметры, либо только именованные, либо и то и другое

Это как вообще?

Ну таки вот:

(int, bool) onlyPos;
(String name) onlyRec;
(int, String name, bool) posAndRec;

Это была ошибка. Правильный вариант вот такой:

    (int, bool) onlyPos;
    (String name,) onePos;
    ({String name}) oneRec;
    (int, String name, {bool count}) posAndRec;

    onlyPos.$1;
    onlyPos.$2;
    onePos.$1;
    oneRec.name;
    posAndRec.$1;
    posAndRec.$2;
    posAndRec.count;

Тип record, содержащий ровно одно позиционное поле, требует завершающей запятой. Для именованных полей это не имеет значение.

Получение позиционных полей идёт с $1 и далее.

Также стоит заметить, что для позиционных полей можно не указывать имя. Оно влияет только на документацию (и понимание кода).

Актуальную спецификацию можете посмотреть здесь - Records Feature Specification

Sign up to leave a comment.

Articles