Что такое typedef в Dart?
Я прочитал описание, и я понимаю, что это псевдоним функционального типа.
Но как его использовать? Зачем объявлять поля с функциональным типом? Когда я его использую? Какую проблему он решает?
Мне кажется, мне нужен один или два реальных примера кода.
Ответы
Ответ 1
Общий шаблон использования typedef в Dart определяет интерфейс обратного вызова. Например:
typedef void LoggerOutputFunction(String msg);
class Logger {
LoggerOutputFunction out;
Logger() {
out = print;
}
void log(String msg) {
out(msg);
}
}
void timestampLoggerOutputFunction(String msg) {
String timeStamp = new Date.now().toString();
print('${timeStamp}: $msg');
}
void main() {
Logger l = new Logger();
l.log('Hello World');
l.out = timestampLoggerOutputFunction;
l.log('Hello World');
}
Запуск вышеприведенного образца дает следующий результат:
Hello World
2012-09-22 10: 19: 15.139: Hello World
В строке typedef указано, что LoggerOutputFunction принимает параметр String и возвращает void.
timestampLoggerOutputFunction соответствует этому определению и, следовательно, может быть назначено в поле out.
Сообщите мне, если вам нужен другой пример.
Ответ 2
Dart 1.24 вводит новый синтаксис typedef для поддержки общих функций. Предыдущий синтаксис все еще поддерживается.
typedef F = List<T> Function<T>(T);
Для получения дополнительной информации см. Https://github.com/dart-lang/sdk/blob/master/docs/language/informal/generic-function-type-alias.md.
Типы функций также могут быть указаны встроенными
void foo<T, S>(T Function(int, S) aFunction) {...}
Смотрите также https://www.dartlang.org/guides/language/language-tour#typedefs
Ответ 3
Просто слегка измененный ответ, в соответствии с последним синтаксисом typedef. Пример можно обновить так:
typedef LoggerOutputFunction = void Function(String msg);
class Logger {
LoggerOutputFunction out;
Logger() {
out = print;
}
void log(String msg) {
out(msg);
}
}
void timestampLoggerOutputFunction(String msg) {
String timeStamp = new Date.now().toString();
print('${timeStamp}: $msg');
}
void main() {
Logger l = new Logger();
l.log('Hello World');
l.out = timestampLoggerOutputFunction;
l.log('Hello World');
}
Ответ 4
typedef LoggerOutputFunction = void Function(String msg);
это выглядит намного яснее, чем в предыдущей версии