8.掌握了Dart中的函数,你就掌握了原力!

妖狐艹你老母 2022-10-01 10:44 247阅读 0赞

目录传送门:《Flutter快速上手指南》先导篇

前面的章节有提到过,在 Dart 中,函数也是一个对象,它的类型是 Function

它可以被赋值给变量,可以被作为参数传递。

声明一个函数

这是个常规的函数声明:

  1. bool isNoble(int atomicNumber) {
  2. return atomicNumber != null;
  3. }
  4. 复制代码
  • 如果一个函数没有显示声明返回值,Dart 会自动推导它的返回值类型。

    1. void main() {
    2. bool b = isNoble(2);
    3. print(b);
    4. }
    5. isNoble(int atomicNumber) {
    6. return atomicNumber != null;
    7. }
  1. >>>
  2. true
  3. 复制代码
  • 如果一个函数没有显示的 return,那么它默认会返回 null。

    1. fun(){}
    2. assert(fun() == null)
    3. 复制代码
  • 如果一个函数只有一句表达式,可以使用简写:

    1. bool isNoble(int atomicNumber) => atomicNumber != null;
    2. isNoble(int atomicNumber) => atomicNumber != null;
    3. 复制代码

可选命名参数

通过 {} 符号,可以用于指定函数参数的名称。

  1. void enableFlags({bool bold = false, bool hidden = false, @required String content}) {
  2. // ...
  3. }
  4. 复制代码

可以看到,Dart 支持我们给参数设置默认值。

调用:

  1. enableFlags(bold: true, content: 'required');
  2. enableFlags(bold: true, hidden: false, content: 'required');
  3. 复制代码

使用 @required 注释的参数,表示必要的参数,在调用的时候你不能遗漏它。

这样的书写形式也是被允许的,不使用 :

  1. void doStuff(
  2. {List<int> list = const [1, 2, 3],
  3. Map<String, String> gifts = const {
  4. 'first': 'paper',
  5. 'second': 'cotton',
  6. 'third': 'leather'
  7. }}) {
  8. print('list: $list');
  9. print('gifts: $gifts');
  10. }
  11. 复制代码

可选位置参数

通过 [] 符号,可以指定该位置的参数是可选的:

  1. String say(String from, String msg,
  2. [String device = 'carrier pigeon', String mood]) {
  3. var result = '$from says $msg';
  4. if (device != null) {
  5. result = '$result with a $device';
  6. }
  7. if (mood != null) {
  8. result = '$result (in a $mood mood)';
  9. }
  10. return result;
  11. }
  12. assert(say('Bob', 'Howdy') ==
  13. 'Bob says Howdy with a carrier pigeon');
  14. 复制代码

其中参数 devicemood 的位置的参数就是可选的,且 device 有默认值。

函数作为变量

正如前面所说,Dart 中的函数是一个 Function 类型的对象,因此它可以被赋值给一个变量。

  1. var say= (str){
  2. print(str);
  3. };
  4. say("hi world");
  5. 复制代码

函数作为入参

函数作为一个对象,它当然也可以被作为参数传递:

  1. void execute(var callback){
  2. callback();
  3. }
  4. execute(()=>print("xxx"))
  5. 复制代码

函数闭包

Dart 函数的特性,使得它很容易实现闭包:

  1. // 返回一个函数对象
  2. Function makeAdder(num addBy) {
  3. return (num i) => addBy + i;
  4. }
  5. void main() {
  6. // 创建一个 +2 的函数
  7. var add2 = makeAdder(2);
  8. // 创建一个 +4 的函数
  9. var add4 = makeAdder(4);
  10. assert(add2(3) == 5);
  11. assert(add4(3) == 7);
  12. }
  13. 复制代码

从这个例子中,可以感受到闭包的强大,它相当于定义了一个动态可配置的函数对象。

typedef 关键字

Dart 提供了 typedef 关键字来定义一种函数格式(具有严格的格式检查),比如:

  1. typedef int Compare(Object a, Object b);
  2. 复制代码

那么,这种格式的函数就被定义成了 Compare 类型。实际上和类的定义是类似的概念。

看看这个例子:

  1. Compare test = (Object a, Object b){
  2. return 0;
  3. }
  4. 复制代码

形如此类的函数,就是 Compare 类型的函数。

当你打算把一个函数赋值给 Compare 类型的变量时,它会严格检查 函数的参数类型返回值类型 是否和 Compare 类型函数 完全对应,不对应的话,编译就会报错。

目录传送门:《Flutter快速上手指南》先导篇

如何找到我?

传送门:CoorChice 的主页

传送门:CoorChice 的 Github

转载于:https://juejin.im/post/5c90c1e45188252d8355467b

发表评论

表情:
评论列表 (有 0 条评论,247人围观)

还没有评论,来说两句吧...

相关阅读

    相关 掌握 Dart 集合使用

    我们将继续 Dart 语法的集合,虽然集合在第一篇中已经介绍的差不多,但是在这篇文章中将会更加全面介绍有关 Dart 中的集合,因为之前只是介绍了 [dart:core 包][