Псевдоним типа в Dart
Псевдоним типа подходит не только для коллекций и карт. Длинная запись функции с параметрами и результатом тоже может получить отдельное имя, чтобы сигнатуры не расползались по файлу.
Тип функции пишут через Function: сначала тип
результата, затем список типов параметров в скобках.
Слово typedef связывает такую запись с коротким
именем:
typedef TextScore = int Function(String);
TextScore scoreByLength() {
return (text) => text.length;
}
Функция scoreByLength возвращает значение типа
TextScore - то есть другую функцию, которая
принимает строку и отдает число. Имя TextScore
можно ставить в параметрах и переменных:
typedef TextScore = int Function(String);
int applyScore(TextScore rule, String line) {
return rule(line);
}
void main() {
TextScore rule = (word) => word.length;
print(applyScore(rule, 'dart'));
}
Переменная rule хранит функцию, а вызов через
имя TextScore выглядит так же, как с полной
записью int Function(String). Анализатор считает
эти обозначения одним типом:
typedef TextScore = int Function(String);
TextScore vowelCount = (text) {
var count = 0;
for (var ch in text.split('')) {
if ('aeiou'.contains(ch)) {
count++;
}
}
return count;
};
void main() {
print(vowelCount('idea'));
}
Для простых имен подойдут короткие псевдонимы вроде
typedef Title = String; или typedef Step = int Function(int);.
Для карт удобно имя ScoreBoard:
typedef ScoreBoard = Map<String, int>;
int totalFor(ScoreBoard board, String player) {
return board[player] ?? 0;
}
Объявите псевдоним для функции из строки в число.
Сохраните в переменную правило, которое возвращает
длину слова. Для строки "api" выведите
результат применения правила.
Сделайте функцию с двумя параметрами: правило под
строку и сама строка. Передайте свое правило и
"log", выведите число, которое вернется.