Dart2基础(六) - 函数

这篇博客介绍了Dart2中的函数概念,包括基本定义、可选参数、参数默认值、匿名函数、作用域和闭包。函数在Dart2中是对象,可以作为参数传递。可选参数有两种声明方式,使用{}或[],并可以设定默认值。匿名函数即lambda表达式,而闭包则能访问外部作用域的变量。每个Dart应用的入口是main函数,无返回值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

基本定义

可选参数

参数默认值 

匿名函数

作用域

闭包

main函数


Dart2是纯面相对象的语言,所以函数也是一个对象。

所有的函数都是基于类Function

函数也可以作为参数,传入其他的函数中。

所有函数都有返回值,如果没有指定返回值,则返回null。

  • 基本定义

函数的定义很简单,下面是一些简单的例子。

// 定义一个不带返回值的函数,可以带void, 也可以不带
void say(var word){
    print("I say '${word}'";
}

// 参数可以不用指定类型,如果不指定,则默认是var
bool isInt(numVar){
    return numVar is int;
}

// 如果函数只有一个return 语句可以用 => 简写
// 需要注意 => 后面只能是一个表达式或者是单条语句。
bool isInt2(numVar) => numVar is int;

main(){
   say('hello world'); // I say 'hello world'
   print(isInt('a')); // false
   print(isInt(1)); // true
}
  • 可选参数

函数允许定义可选的参数。

定义可选参数有两种方式一种使用{}, 另一种使用[]。区别就是, 如果用{}声明,在使用时必须带着参数名,如:a:123;如果用[]声明,在使用时需要按照顺序使用。

void travel({String from, String to}){
    print("From ${from} to ${to}");
}

void travel2(String from, [String to, String city]){
    print("From ${from} to ${to} and ${city}");
}

main(){
    travel(); // From null to null
    // 必须传入的是哪个参数的值
    travel(to:"usa"); // From null to usa;
    travel(from:"china", to:"usa") // From china to usa;
    travel2("china"); // From china to null and null;
    // 按照顺序传入参数值
    travel2("china", "usa"); // From china to usa and null;
    travel2("china", "usa", "england"); // From china to usa and england;
}

可选的参数,也是可以用@required指定可选的参数变成比填。要使用@required需要引入包 package:meta/meta.dart,如果是用flutter,则可以引入包package:flutter/material.dart。

void travel({@required String from , String to}){}
  • 参数默认值 

函数的参数可以用=来定义默认值,如果没有用=赋予默认值,那么参数默认值为null。

参数的默认值必须是编译时常量。

ps: 您可能见过用:来赋予参数默认值,这是老代码的使用方式,但是这个将在后续版本中去掉,所以最好还是用=。

void travel({String from="china", String to="usa"}){
  print("From ${from} to ${to}");
}

// list和map的默认值需要用const修饰
void animals([List<String> names= const ["cat", "dog"], Map<String, String> nameMap = const{
  "c": "cat", 
  "d": "dog"
}]){
  print("animals: ${names}");
  print("nameMap: ${nameMap}");
}

main(){
    travel(); // From china to usa;
    travel(from:"japan"); // From japan to usa;
    animals(); // animals:['cat', 'dog'] nameMap: {'c', 'cat', 'd': 'dog'}
}

 

  • 匿名函数

匿名函数的定义

([[Typeparam1[, …]]) { 
  codeBlock
}; 

main(List<String> args) {
  var listVar = ["cat", 'dog'];
  listVar.forEach((animal){
    print("animal is ${animal}");
  });
  // 如果只有一行代码,可以使用=>
  listVar.forEach((animal) => print("animal is ${animal}"));
}
  • 作用域

Dart2语言的变量是有作用域的,变量的作用域是由代码布局决定的。下面是一个简单的例子。

var level1 = "level1";
main(List<String> args) {
  var level2 = "level2";
  // 定义一个内部函数
  void testScope(){
    var level3 = "level3";
    print(level1); // level1
    print(level2); // level2
    print(level3); // level3
  }
  // 运行内部函数
  testScope(); 
}
  • 闭包

闭包是一个函数对象,可以读取其他作用域内的变量使用。

使用匿名函数可以轻松实现一个闭包。

// 本实例来自于官网
Function makeAdder(num){
  return (addNum){
    return addNum + num;
  };
}
main(){
  var add5 = makeAdder(5);
  var add10 = makeAdder(10);

  print(add5(1)); // 6
  print(add10(1)); // 11
}
  • main函数

main函数是应用的入口。每一个应用都必须有一个Main函数作为入口。main函数没有返回值,并且有一个 List<String>类型的变量。

main(List<String> args) {
  print(args)
}

// 运行命令  dart test.dart hello world
// 结果: [hello, world]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值