方法声明

Dart是一个真正的面向对象的语言,所有东西都是对象,包括函数,每个函数都是Function类型。

声明一个函数:

bool isEven(int num) {
  return num % 2 == 0;
}
main(){
  print(isEven(3)); //false
}

上面的方法接收一个int类型参数,返回值是bool类型。其实上面的函数可以简写为这样:

isEven(num) {
  return num % 2 == 0;
}

我们省略了返回值类型和参数类型,它依然能够工作,这得益于Dart强大的类型推断系统。但这样做会导致性能低下,Dart推荐明确指出返回值和参数的类型,这样可读性会更好,而且更加高效。

main函数没有返回值,它的完整写法是这样:

void main(){
    //...
}

单表达式函数

如果函数的表达式只有一行,我们可以进行简写,这和Kotlin类似:

bool isEven(int num) => num % 2 == 0;

可选位置参数

一个函数会有多个参数,但有时候某个位置的参数值是固定的,我们并不想传递,可以使用[]来声明可选参数:

void sayHello(String name, int age, [String city = '武汉']){
  print("名字:$name 年龄:$age 城市:$city");
}
sayHello("李雷", 15); //名字:李雷 年龄:15 城市:武汉
sayHello("韩梅梅", 18, '北京');//名字:韩梅梅 年龄:18 城市:北京

我们将city参数设置为可选的,调用者可以不传这个参数。如果不传就使用默认值,如果传了就使用传的值。想一下,如果不给city设置默认值,那默认是什么?

可选命名参数

命名参数可以让我们根据参数的名字来传递,不用关心参数的顺序,而且也可以不传。使用{}包裹参数就是命名参数:

void sayHello({String name, int age, String city = '武汉'}){
  print("名字:$name 年龄:$age 城市:$city");
}
sayHello(age: 15, name: "李雷");//顺序可以和声明的不一致
sayHello(name: "王二"); //年龄不传为null
sayHello(name: "韩梅梅", age: 18, city: '北京');

函数式编程

Dart中的函数也是对象,所以可以作为参数传递,,也可以使用变量记录。

void printElement(int element) {
  print(element);
}
[1, 2, 3].forEach(printElement);

将方法赋值给一个变量:

var fn = (num) => num % 2 == 0 ;
print(fn(3));

匿名函数

大部分函数都是有名字的,一般临时用的函数都没有名字,比如:

[1, 2, 3].forEach( (el) { print(el); });

forEach中的就是匿名函数。

词法作用域

Dart支持词法作用域,变量的范围是静态确定的,通过声明时所在的代码块就可以看出它的作用域范围。

var a = 1; //整个文件都能用
main() {
  var b = 2; //main方法以内都能用
  void foo(){
    var c = 3;//foo方法内能用
  }
}

闭包

闭包就是一个函数始终能访问它作用域内的变量,即使函数被调用时在声明时的作用域外面。

我们定义一个函数,返回值也是一个函数:

Function makeAdder(int start){
  return (int i) => start + i;
}

使用闭包函数:

var addFrom2 = makeAdder(2); //addFrom2是一个函数
print(addFrom2(3));//5
var addFrom5 = makeAdder(5);
print(addFrom5(5));//10

可见性

你可能注意到我们写了这么多方法,都没有添加像Java那样(public/private)的可见性修饰符。其实Dart提供了一种较为简单的可见性处理,跟Go语言类似。

规则是这样的:如果方法名以下划线开头,那这个方法就只能在自己的模块或者自己的文件中使用,对别的模块和文件是不可见的;反之都能使用。这个规则同样适用于类名,属性名。

下面定义一个模块私有方法:

//对本文件和本模块可见,别的文件中无法使用
void _foo(){
  print("i am a private to this file");
}

这种可见性处理我个人觉得还是非常简洁的,一下子减少好几个关键字。

更新时间: 4/26/2019, 1:29:12 PM