• Dart 笔记:函数


    函数也是对象并且类型为Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。

    void main() {
      var strMaps = {1: 'a', 2: 'b', 3: 'c'};
      // 箭头 函数
      isInMap(Map<int, String> maps) => maps.keys.contains(1);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    => 是{ return 表达式; }的简写,=> 称之为箭头函数。在=>与;之间的只能是表达式而非语句。

    参数

    函数可以有两种形式的参数:必要参数和可选参数。必要参数定义在参数列表前面,可选参数则定义在必要参数后面。可选参数可以是命名的。向函数传入参数或者定义函数参数时,可以使用 尾逗号。

    命名参数

    命名参数默认为可选参数,除非他们被特别标记为required。

    // 定义函数时,使用 {参数1, 参数2, …} 来指定命名参数
      void enableFlags({bool? bold, bool? hidden}) {...}
      
      // 当调用函数时,可以使用 参数名:参数值 指定一个命名参数的值
      enableFlags(bold: true, hidden: false);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如果一个参数是可选的,但是不能为 null,你需要为它提供一个 默认值。

    可选的位置参数

    使用 [] 将一系列参数包裹起来作为位置参数:

    void main() {
      String say(String from, String msg, [String? device, int? price]) {
        var result = '$from says $msg';
        if (device != null) {
          result = '$result with a $device';
        }
        if (device != null && price != null) {
          result = '$result with a $device ,price:$price RMB';
        }
        return result;
      }
    
      // 不使用可选参数
      var words = say('小米', '手机很流畅');
      print(words); // 小米 says 手机很流畅
      
      //使用可选参数
      var words1 = say('小米', '手机很流畅', 'MI Pro');
      print(words1);// 小米 says 手机很流畅 with a MI Pro
    
       //使用可选参数
      var words2 = say('小米', '手机很流畅', 'MI Pro', 1000);
      print(words2);// 小米 says 手机很流畅 with a MI Pro with a MI Pro ,price:1000 RMB
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    默认参数值

    可以用 = 为函数的命名参数和位置参数定义默认值,默认值必须为编译时常量,没有指定默认值的情况下默认值为 null。

    // 设置可选参数默认值
      enableFlags(bold: true);
      
      // 设置位置参数设置默认值
      String say(String from, String msg, [String device = 'carrier pigeon']) {
         var result = '$from says $msg with a $device';
         return result;
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • List 或 Map 同样也可以作为默认值:
    void main() {
       doStuff();
    }
    
    void doStuff(
        {List<int> list = const [1, 2, 3],
        Map<String, String> gifts = const {
          'first': 'paper',
          'second': 'cotton',
          'third': 'leather'
        }}) {
      print('list:  $list');
      print('gifts: $gifts');
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    函数是一级对象
    • 可以将函数作为参数传递给另一个函数:
    void main() {
      var list = [1, 2, 3];
      list.forEach(printElement);
    }
    
    void printElement(int element) {
      print(element);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 将函数赋值给一个变量:
    void main() {
      var info= (msg)=>'打印信息:$msg';
      print(info('hello world'));
    }
    
    • 1
    • 2
    • 3
    • 4
    匿名函数

    创建一个没有名字的方法,称之为匿名函数、Lambda表达式或Closure闭包。将匿名方法赋值给一个变量然后使用它。

    • 定义了只有一个参数item且没有参数类型的匿名方法:
    void main() {
      const list = ['apples', 'bananas', 'oranges'];
      list.forEach((item) {
        print('${list.indexOf(item)}: $item');
      });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 如果函数体内只有一行返回语句,可以使用胖箭头缩写法
    void main() {
      const list = ['apples', 'bananas', 'oranges'];
      list.forEach((item) => print('${list.indexOf(item)}: $item'));
    }
    
    • 1
    • 2
    • 3
    • 4
    闭包

    一个函数对象,即使函数对象的调用在它原始作用域之外,依然能够访问在它词法作用域内的变量。

    void main() {
       // 返回sum(int) 函数对象
       var sum=makeAdder(1);
      
       var result=sum(1);
      
       print("result:$result"); // result:2
    }
    
    Function makeAdder(int addBy) {
      // 返回Function类型(实际上返回了一个函数)
      return (int i) => addBy + i;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    注意:所有的函数都有返回值。没有显示返回语句的函数最后一行默认为执行 return null。

  • 相关阅读:
    React antd Table点击下一页后selectedRows丢失之前页选择内容的问题
    【C/C++】你知道位段吗?段位?不,是位段!
    尚硅谷Nginx教程由浅入深--笔记
    多模态大模型时代下的文档图像智能分析与处理
    AnyTXT Searcher:本地文件内容搜索神器如何搭建与远程访问
    产品经理简要介绍主流电商平台商品API接口的重要应用价值
    GO环境及入门案例
    Java 【异常】
    Windows环境单节点部署kafka最新版本3.2.1实战(超简单)
    W801学习笔记十四:掌机系统——菜单——尝试打造自己的UI
  • 原文地址:https://blog.csdn.net/xufei5789651/article/details/128060815