Dart语言教程:Typedef(用作引用函数的指针)

2019-06-2216:15:04编程语言入门到精通Comments6,907 views字数 2292阅读模式

typedef或函数类型别名有助于定义指向内存中可执行代码的指针。简单地说,typedef可以用作引用函数的指针。
下面给出了在Dart程序中实现typedef的步骤。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

第1步:定义typedef文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef可用于指定希望特定函数匹配的函数签名。函数签名由函数的参数(包括其类型)定义。返回类型不是函数签名的一部分。语法如下 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef function_name(parameters)

第2步:将函数分配给typedef变量文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef的变量可以指向与typedef具有相同签名的函数。可以使用以下签名将函数分配给typedef变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

type_def  var_name = function_name
Dart

第3步:调用函数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef变量可用于调用函数。以下是调用函数的方法 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

var_name(parameters)
Dart

示例

下面我们来一个例子,以了解Dart中关于typedef的更多信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

在示例中,首先定义一个typedef,定义的是一个函数签名。该函数将采用整数类型的两个输入参数。返回类型不是函数签名的一部分。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef ManyOperation(int firstNo , int secondNo); //function signature
Dart

接下来定义函数。使用与ManyOperation typedef相同的函数签名定义一些函数。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); 
}  
Subtract(int firstNo,int second){ 
   print("Subtract result is ${firstNo-second}"); 
}  
Divide(int firstNo,int second){ 
   print("Add result is ${firstNo/second}"); 
}
Dart

最后通过typedef调用该函数。声明ManyOperations类型的变量。将函数名称分配给声明的变量。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

ManyOperation oper ;  

//can point to any method of same signature 
oper = Add; 
oper(10,20); 
oper = Subtract; 
oper(30,20); 
oper = Divide; 
oper(50,5);
Dart

oper变量可以指向任何采用两个整数参数的方法。Add函数的引用赋给变量。typedef可以在运行时切换函数引用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

下面将所有部分放在一起,看看完整的程序。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef ManyOperation(int firstNo , int secondNo); 
//function signature  

Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); 
} 
Subtract(int firstNo,int second){ 
   print("Subtract result is ${firstNo-second}"); 
}
Divide(int firstNo,int second){ 
   print("Divide result is ${firstNo/second}"); 
}  
Calculator(int a, int b, ManyOperation oper){ 
   print("Inside calculator"); 
   oper(a,b); 
}  
void main(){ 
   ManyOperation oper = Add; 
   oper(10,20); 
   oper = Subtract; 
   oper(30,20); 
   oper = Divide; 
   oper(50,5); 
}
Dart

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

Add result is 30 
Subtract result is 10 
Divide result is 10.0
Shell

注 - 如果typedef变量尝试指向具有不同函数签名的函数,则上述代码将导致错误。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

示例

typedef也可以作为参数传递给函数。阅读以下示例代码 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

typedef ManyOperation(int firstNo , int secondNo);   //function signature 
Add(int firstNo,int second){ 
   print("Add result is ${firstNo+second}"); 
}  
Subtract(int firstNo,int second){
   print("Subtract result is ${firstNo-second}"); 
}  
Divide(int firstNo,int second){ 
   print("Divide result is ${firstNo/second}"); 
}  
Calculator(int a,int b ,ManyOperation oper){ 
   print("Inside calculator"); 
   oper(a,b); 
}  
main(){ 
   Calculator(5,5,Add); 
   Calculator(5,5,Subtract); 
   Calculator(5,5,Divide); 
}
Dart

执行上面示例代码,得到以下结果 -文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

Inside calculator 
Add result is 10 
Inside calculator 
Subtract result is 0 
Inside calculator 
Divide result is 1.0

原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/dart/dart_programming_typedef.html#article-start文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13770.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/13770.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定