首页 > 其他分享 >Flutter/Dart第11天:Dart函数方法详解

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

时间:2023-10-06 20:12:07浏览次数:38  
标签:11 函数 int void 生成器 Dart assert Flutter

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;

// 函数实现
bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

// 箭头语法,上诉函数的简单语法
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<String>类型。

代码样例:如下代码,我们在执行Dart文件时,指定了参数dart args.dart 1 test

void main(List<String> arguments) {
  print(arguments);

  assert(arguments.length == 2);
  assert(int.parse(arguments[0]) == 1);
  assert(arguments[1] == 'test');
}

函数作为参数

函数可以作为其他函数的入参,也可以赋值给变量。

// 1. 函数作为函数入参
void printElement(int element) {
  print(element);
}

var list = [1, 2, 3];
list.forEach(printElement);

// 2. 函数赋值给变量(匿名函数)
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');

匿名函数

如上代码,main()printElement()函数都是命名函数。我们也可以创建匿名函数(如上代码loudify变量的值),特别是在Lambda表达式或者在闭包函数中,匿名函数使用场景很多。

代码样例:如下代码,map()forEach()的入参就是匿名函数。

void main() {
  const list = ['apples', 'bananas', 'oranges'];
  list
    .map((item) => item.toUpperCase())
    .forEach((item) => print('$item: ${item.length}'));
}

函数相等校验

可以进行相等校验的函数包括:顶级函数,静态函数和实例函数。

// 1. 顶级函数
void foo() {}

class A {
  // 2. 静态方法
  static void bar() {}
  // 3. 实例方法
  void baz() {}
}

void main() {
  Function x;

  // 顶级函数相等校验
  x = foo;
  assert(foo == x);

  // 静态方法相等校验
  x = A.bar;
  assert(A.bar == x);

  // 实例方法相等校验
  var v = A(); // A实例#1
  var w = A(); // A实例#2
  var y = w;
  x = w.baz;

  // 同是A实例#2方法
  assert(y.baz == x);

  // 不同实例方法
  assert(v.baz != w.baz);
}

函数返回值

如果没有显示返回值,函数默认返回null,Record记录可以聚合返回多个值。

(String, int) foo() {
  return ('something', 42);
}

生成器函数

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

  1. 同步生成器:返回1个Iterable对象。
  2. 异步生成器:返回1个Stream对象。

同步生成器函数:使用sync*标记函数体,并且使用yield表达式产生值。

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}

异步生成器函数:使用async*标记函数体,并且使用yield表达式产生值。

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}

如果生成器是递归的,可以通过yield*来提升性能。

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}

我的本博客原地址:https://ntopic.cn/p/2023100601


标签:11,函数,int,void,生成器,Dart,assert,Flutter
From: https://www.cnblogs.com/obullxl/p/NTopic2023100601.html

相关文章

  • 38-11
    设C={a1,b1,a2,b2,.....,an,bn};使用带头结点的单链表,将C分割成A={a1,a2,a3,....,an};,B={bn,bn-1,....,b2,b1};注意B是逆置,应采用头插法对于abababab这种结点,可以使用count记录奇偶,也可以一个while循环中分别对A,B进行插入#include<stdio.h>#include<stdlib.h>typedefstru......
  • python11
    3.3字符串的公共功能1.相加:字符串+字符串v1="吉林省"+"长春市"print(v1)2.相乘:字符串*整数data="alex"*3print(data)3.长度data="吉林省长春市"value=len(data)print(value)4.获取字符串中的字符,索引message="吉林省长春市"#012......
  • WIN11 安装 SQL Server 2019,SQLSERVER2022, MYSQL 8.0 ,Docker,Mongodb失败故障分析
    最近研究数据库性能调优遇到各种数据库各种装不上,不知道熬了多少根软白沙,熬了多少颗张三疯,问了多少AI,查了多少网页,熬了两天,终于搞明白了一件事:那就是WIN11ONARM(因为拿的是MACPROM2做.NET平台开发安装)SQLSERVER2019,SQLSERVER2022,MYSQL8.0,Docker,Mongodb失败故障分析,最终极......
  • cf1110D. Jongmah
    cf1110D.Jongmah如果能够发现一点转化的话就简单很多比如说最后的答案里出现了三个(a,a+1,a+2),我们可以将它看作是(a,a,a),(a+1,a+1,a+1),(a+2,a+2,a+2)也就是每种三元组(除了(a,a,a))最多只会出现两次那么每种数最多有6个是个其它数组成三元组。直接dp即可#include<cstdio>#......
  • python11
    3.3字符串的公共功能1.相加:字符串+字符串v1="吉林省"+"长春市"print(v1)2.相乘:字符串*整数data="alex"*3print(data)3.长度data="吉林省长春市"value=len(data)print(value)4.获取字符串中的字符,索引message="吉林省长春市"#012......
  • iPhone 15 Pro Max的Type-C接口有多牛?实测USB3比USB2快11倍
    苹果最新的iPhone15系列和iPhone15Pro系列新机,尽管两者都是Type-C接口,但速度相差20倍。据了解,iPhone15Pro/Max搭载的苹果A17Pro芯片内含专门的USB3模块,使其成第一款具备USB3速度的iPhone手机。有了这个模块,iPhone15Pro/Max的USB3比起iPhone15(A16芯片)的USB2来说,速度......
  • 【图论】【寻找性质】CF1151E Number of Components 题解
    CF1151E发现每一个\(f(l,r)\)中的连通块总是一条链(一棵树)。那么此时连通块的数量就等于点的数量减去边的数量。先考虑点的总数,一个价值为\(a_i\)的点一定是在\(l\leqslanta_i\)且\(r\geqslanta_i\)的\(f(l,r)\)中才会有一个贡献,根据乘法原理,它会产生\(a_i\time......
  • 装机不再无聊了:Win11首次开机添加“冲浪”小游戏
    为了让大家装机过程不再无聊,微软居然在Win11的开机中加入了一个小游戏。据TheVerge报道,微软SurfaceLaptopStudio2首次开机配置时,如果有需要用户等待的流程,就弹出一个游戏窗口,点击就能直接玩小游戏。这个小游戏很多人并不陌生,早在2020年,微软便向基于Chromium内核的Edge浏览......
  • Flutter/Dart第10天:Dart高级特性Pattern模式的全部类型(共15种)
    Dart官方文档:https://dart.dev/language/pattern-types重要说明:本博客基于Dart官网文档,但并不是简单的对官网进行翻译,在覆盖核心功能情况下,我会根据个人研发经验,加入自己的一些扩展问题和场景验证。和操作符一样,模式运算也遵循一定的优先级规则,我们可以通过增加括号()让低优先级......
  • 11_动态空间申请
    动态空间申请new和delete操作基本类型空间new申请堆区空间,delete释放空间int*p=NULL;p=newint;//从堆区申请int类型大小的空间*p=100;cout<<"*p="<<*p<<endl;//释放空间deletep;//new申请空间时初始化空间int*p1=NULL;p1=newint(150);co......