Подтвердить что ты не робот

Что такое typedef в Dart?

Я прочитал описание, и я понимаю, что это псевдоним функционального типа.

  • Типед или псевдоним функционального типа предоставляет тип функции имя, которое можно использовать при объявлении полей и возвращаемых типов. Типед сохраняет информацию типа, когда тип функции присваивается переменной.

  • http://www.dartlang.org/docs/spec/latest/dart-language-specification.html#kix.yyd520hand9j

Но как его использовать? Зачем объявлять поля с функциональным типом? Когда я его использую? Какую проблему он решает?

Мне кажется, мне нужен один или два реальных примера кода.

4b9b3361

Ответ 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);

это выглядит намного яснее, чем в предыдущей версии