Функция как аргумент в другой функции - Dart

какая разница между

void test1(void fun(String element)) {
  fun("Test1");
}

//AND

void test2(Function(String element) fun) {
  fun("Test2");
}

Я попытался запустить их оба и не нашел отличий в выводе:

void main() {
  test1((test) => print(test));
  test2((test) => print(test));
}

void test1(void fun(String element)) {
  fun("Test1");
}

void test2(Function(String element) fun) {
  fun("Test2");
}

// Output:  
// Test1   
// Test2

Я новичок в Dart. Я всегда использую Java, поэтому передача функции функции для меня в новинку, поэтому, если кто-нибудь может объяснить мне, в чем различия в приведенном выше коде, был бы очень благодарен.

Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
9
0
4 475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет реальной разницы между объявлением параметра функции с типом функции, предшествующим имени (void Function(String) fun), или как (C-подобный) синтаксис, подобный функции, где имя находится посередине (void fun(String element)). Оба объявляют аргумент с именем fun с типом void Function(String).

Изначально у Dart не было способа написать тип функции в строке, вам нужно было использовать typedef, поэтому в большинстве старых кодов используется нотация void fun(String element). Когда была введена нотация returnType Function(arguments) (поскольку она была необходима для определения универсальных типов функций), стало проще записывать типизированные параметры функции с указанием типа в первую очередь.

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

Есть одно различие между двумя форматами, о котором стоит помнить:

  • Обозначение void fun(String element) требует имен для аргументов функции. Если вы пишете void fun(String), это интерпретируется как функция, принимающая один аргумент типа dynamic с именем String.
  • Обозначение void Function(String) fun предполагает, что типом является имя единственного аргумента.

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

Другие вопросы по теме