Flutter/Dart第11天:Dart函数办法详解
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个Iterable目标。
- 异步生成器:回来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