Dart 中的函数类型定义/函数类型别名是啥?

Posted

技术标签:

【中文标题】Dart 中的函数类型定义/函数类型别名是啥?【英文标题】:What are function typedefs / function-type aliases in Dart?Dart 中的函数类型定义/函数类型别名是什么? 【发布时间】:2012-09-14 18:36:34 【问题描述】:

我看了描述,明白是函数类型别名。

typedef 或函数类型别名为函数类型提供了一个名称,您可以在声明字段和返回类型时使用该名称。将函数类型分配给变量时,typedef 会保留类型信息。

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

但是我该如何使用它呢?为什么用函数类型声明字段?我什么时候使用它?它解决了什么问题?

我想我需要一两个真实的代码示例。

【问题讨论】:

请注意,这个问题与 function typedefs 密切相关。在 Dart 2.13 中,添加了一个新功能,支持所有类型的 generalized 类型别名。我为此创建了一个新问题:***.com/q/66847006/6509751。这里的所有答案(和问题)都只讨论旧格式,这就是为什么这是必要的。 【参考方案1】:

从 dart 2.13 版开始,您不仅可以将 typedef 用于函数,还可以将其用于您想要的每个对象。

例如,这段代码现在完全有效:

typedef IntList = List<int>;
IntList il = [1, 2, 3];

有关更多详细信息,请参阅更新信息: https://dart.dev/guides/language/language-tour#typedefs

【讨论】:

【参考方案2】:

Dart 中的Typedef 用于为其他应用程序功能创建用户定义的函数(别名),

Syntax: typedef function_name (parameters);

借助 typedef,我们还可以将变量分配给函数。

Syntax:typedef variable_name = function_name;

分配变量后,如果我们必须调用它,那么我们可以这样:

Syntax: variable_name(parameters);

示例:

// Defining alias name
typedef MainFunction(int a, int b);

functionOne(int a, int b) 
  print("This is FunctionOne");
  print("$a and $b are lucky numbers !!");


functionTwo(int a, int b) 
  print("This is FunctionTwo");
  print("$a + $b is equal to $a + b.");


// Main Function
void main() 
  // use alias
  MainFunction number = functionOne;

  number(1, 2);

  number = functionTwo;
 // Calling number
  number(3, 4);

输出:

This is FunctionOne
1 and 2 are lucky numbers !!
This is FunctionTwo
3 + 4 is equal to 7

【讨论】:

【参考方案3】:
typedef LoggerOutputFunction = void Function(String msg);

这看起来比以前的版本清晰得多

【讨论】:

【参考方案4】:

只是稍微修改了答案,根据最新的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');

【讨论】:

您能说说为什么将print 分配给out 吗? print 是什么? print 是 Dart 的 print 函数,所以在默认构造函数中会为 out 分配 print 方法,这意味着如果我们没有提供 func,它将使用来自 Dart 的默认 print 方法。 api.dart.dev/stable/2.5.0/dart-core/print.html【参考方案5】:

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

【讨论】:

【参考方案6】:

Dart 中 typedef 的一个常见使用模式是定义一个回调接口。例如:

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');

运行上述示例会产生以下输出:

你好世界 2012-09-22 10:19:15.139: 你好世界

typedef 行说 LoggerOutputFunction 接受一个 String 参数并返回 void。

timestampLoggerOutputFunction 与该定义匹配,因此可以分配给 out 字段。

如果您需要另一个示例,请告诉我。

【讨论】:

注意;此答案使用旧版 typedef 表示法。首选是typedef LoggerOutputFunction = void Function(String msg);(来自dartlang.org/guides/language/effective-dart/…) 请给我另一个例子@Cutch 不要忘记在 Dart 中一切都是对象,甚至函数(方法)。这意味着您可以将函数分配给变量。这可能会让 Java 用户感到惊讶。 @BangOperator 当前 typedefs 仅支持函数类型,支持非函数类型存在一个未解决的问题,例如您使用双精度的示例。 github.com/dart-lang/language/issues/65 现在,Dart(从 Dart 2.13 开始)也支持非函数类型的通用类型定义。有关更多信息,请参阅以下答案:***.com/a/66847007/6509751

以上是关于Dart 中的函数类型定义/函数类型别名是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的func类型是啥

如何创建引用特定函数的函数类型的类型别名

为啥我的 Dart 构造函数返回的是动态对象而不是类型对象?

将类型函数作为Dart中的参数传递

[C++11]通过using定义基础类型和函数指针别名

类--其他特性,作用域,构造函数,静态成员