Dart 笔记:函数

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

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

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

参数

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

命名参数

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

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

如果一个参数是可选的,但是不能为 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
}
默认参数值

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

// 设置可选参数默认值
  enableFlags(bold: true);
  
  // 设置位置参数设置默认值
  String say(String from, String msg, [String device = 'carrier pigeon']) {
     var result = '$from says $msg with a $device';
     return result;
  }
  • 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');
}
函数是一级对象
  • 可以将函数作为参数传递给另一个函数:
void main() {
  var list = [1, 2, 3];
  list.forEach(printElement);
}

void printElement(int element) {
  print(element);
}
  • 将函数赋值给一个变量:
void main() {
  var info= (msg)=>'打印信息:$msg';
  print(info('hello world'));
}
匿名函数

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

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

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

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;
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值