函数

函数定义

int add(int num1, int num2) {
  return num1 + num2;
}
add(1, 2); // 3
  1. 返回值是 int
  2. 接收两个 int 类型的参数

所有的函数都返回一个值。如果没有指定返回值,则默认把语句 return null; 作为函数的最后一个语句执行。

胖箭头语法

如果函数体只包括一条语句, 可以使用胖箭头语法

上面的函数可以写为

int add(int num1, int num2) => num1 + num2;

命名参数

使用花括号将参数括起来即可:

int add({int num1, int num2}) => num1 + num2;

命名参数是可选的, 静态检查时不会报错, 运行时可能会报错:

add(num1: 1, num2: 2); // 3
add(num1: 1); // Error

可选命名参数

为了可以规避上面的错误, 可以使用可选参数:

int add({int num1 = 0, int num2 = 0}) => num1 + num2;
add(num1: 1, num2: 2); // 3
add(num1: 1); // 1
add(); // 0

可选命名参数同样适用于 List 或 Map 这样的泛型参数:

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

可选位置参数

如果不使用命名参数, 使用位置参数又希望其可以选填, 则使用中括号将其包裹

int add(int num1, int num2, [int num3 = 0]) => num1 + num2 + num3;
add(1,2,3); // 6
add(1,2); // 3

一等方法对象

可以把方法当做参数调用另外一个方法。例如:

printElement(element) {
  print(element);
}
var list = [1, 2, 3];
list.forEach(printElement);

匿名方法

上面的调用方式等价于:

list.forEach((item) { printElement(item); });

如果方法只包含一个语句,可以使用胖箭头语法缩写

list.forEach((item) => printElement(item));

变量赋值

方法也可以赋值给一个变量:

var printElement = (element) => print(element);

作用域

Dart 中 var 的作用域与 JS 中的 let 类似, 包括全局作用域、局部作用域、块级作用域

闭包

跟 JS 类似的闭包语法:

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}
var add10 = makeAdder(10);
print(add10(5)); // 15
print(add10(3)); // 13

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress