Flutter/Dart第11天:Dart函数方法详解

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

Dart官方文档:https://dart.dev/language/functions
重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。
Dart语言是纯面向对象的编程语言,就是是函数也是对象,它的类型就是Function类(https://api.dart.dev/stable/3.1.3/dart-core/Function-class.html)。
如下代码样例,函数的不同实现。如果函数实现仅仅只有1个表达式,那么函数可以使用箭头语法:=> return expression;
  1. // 函数实现
  2. bool isNoble(int atomicNumber) {
  3.   return _nobleGases[atomicNumber] != null;
  4. }
  5. // 箭头语法,上诉函数的简单语法
  6. bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;
复制代码
命名参数(必选,默认值)

参数格式:functionName({param1 = value1, param2, ...})
函数调用:functionName(param1: valueX, param2: value2, ...)
默认情况下,命名参数是可选的,除非显示增加required标记。在Flutter中,尤其是Widget是构造函数,仅仅使用命名参数,尽管参数是必填参数。
特别注意:就算了增加required的必选参数,它也可以是可空的。
位置参数(可选,默认值)

可选位置参数通过[]包裹的参数列表,默认值为null,可以设置默认值:
参数格式:functionName(param1, param2, [param3 = value3, param4]);
函数调用:functionName(value1, value2);或functionName(value1, value2, value3);或functionName(value1, value2, value3, value4);
main()函数

任何Dart应用,都必须包含一个顶级main()函数,它是应用的唯一入口。它的返回值是void,入参是List类型。
代码样例:如下代码,我们在执行Dart文件时,指定了参数dart args.dart 1 test
  1. void main(List<String> arguments) {
  2.   print(arguments);
  3.   assert(arguments.length == 2);
  4.   assert(int.parse(arguments[0]) == 1);
  5.   assert(arguments[1] == 'test');
  6. }
复制代码
函数作为参数

函数可以作为其他函数的入参,也可以赋值给变量。
  1. // 1. 函数作为函数入参
  2. void printElement(int element) {
  3.   print(element);
  4. }
  5. var list = [1, 2, 3];
  6. list.forEach(printElement);
  7. // 2. 函数赋值给变量(匿名函数)
  8. var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
  9. assert(loudify('hello') == '!!! HELLO !!!');
复制代码
匿名函数

如上代码,main()和printElement()函数都是命名函数。我们也可以创建匿名函数(如上代码loudify变量的值),特别是在Lambda表达式或者在闭包函数中,匿名函数使用场景很多。
代码样例:如下代码,map()和forEach()的入参就是匿名函数。
  1. void main() {
  2.   const list = ['apples', 'bananas', 'oranges'];
  3.   list
  4.     .map((item) => item.toUpperCase())
  5.     .forEach((item) => print('$item: ${item.length}'));
  6. }
复制代码
函数相等校验

可以进行相等校验的函数包括:顶级函数,静态函数和实例函数。
  1. // 1. 顶级函数
  2. void foo() {}
  3. class A {
  4.   // 2. 静态方法
  5.   static void bar() {}
  6.   // 3. 实例方法
  7.   void baz() {}
  8. }
  9. void main() {
  10.   Function x;
  11.   // 顶级函数相等校验
  12.   x = foo;
  13.   assert(foo == x);
  14.   // 静态方法相等校验
  15.   x = A.bar;
  16.   assert(A.bar == x);
  17.   // 实例方法相等校验
  18.   var v = A(); // A实例#1
  19.   var w = A(); // A实例#2
  20.   var y = w;
  21.   x = w.baz;
  22.   // 同是A实例#2方法
  23.   assert(y.baz == x);
  24.   // 不同实例方法
  25.   assert(v.baz != w.baz);
  26. }
复制代码
函数返回值

如果没有显示返回值,函数默认返回null,Record记录可以聚合返回多个值。
  1. (String, int) foo() {
  2.   return ('something', 42);
  3. }
复制代码
生成器函数

生成器函数可以延迟产出一系列值,Dart中内置2类生成器函数:

  • 同步生成器:返回1个Iterable对象。
  • 异步生成器:返回1个Stream对象。
同步生成器函数:使用sync*标记函数体,并且使用yield表达式产生值。
  1. Iterable<int> naturalsTo(int n) sync* {
  2.   int k = 0;
  3.   while (k < n) yield k++;
  4. }
复制代码
异步生成器函数:使用async*标记函数体,并且使用yield表达式产生值。
  1. Stream<int> asynchronousNaturalsTo(int n) async* {
  2.   int k = 0;
  3.   while (k < n) yield k++;
  4. }
复制代码
如果生成器是递归的,可以通过yield*来提升性能。
  1. Iterable<int> naturalsDownFrom(int n) sync* {
  2.   if (n > 0) {
  3.     yield n;
  4.     yield* naturalsDownFrom(n - 1);
  5.   }
  6. }
复制代码
我的本博客原地址:https://ntopic.cn/p/2023100601

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表