void printElement(int element) { print(element); } var list = [1, 2, 3]; // 把 printElement函数作为一个参数传递进来 list.forEach(printElement);
您也可以将一个函数分配给一个变量。
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!'; assert(loudify('hello') == '!!! HELLO !!!');
匿名函数
大多数函数都能被命名为匿名函数,如 main() 或 printElement()。您还可以创建一个名为匿名函数的无名函数,有时也可以创建lambda或闭包。您可以为变量分配一个匿名函数,例如,您可以从集合中添加或删除它。
一个匿名函数看起来类似于一个命名函数 - 0或更多的参数,在括号之间用逗号和可选类型标注分隔。
下面的代码块包含函数的主体:
([[Type] param1[, …]]) { codeBlock; };
下面的示例定义了一个具有无类型参数的匿名函数item,该函数被list中的每个item调用,输出一个字符串,该字符串包含指定索引处的值。
var list = ['apples', 'bananas', 'oranges']; list.forEach((item) { print('${list.indexOf(item)}: $item'); });
如果函数只包含一条语句,可以使用箭头符号=>来缩短它, 比如上面的例2可以简写成:
list.forEach((item) => print('${list.indexOf(item)}: $item'));
返回值
所有函数都返回一个值,如果没有指定返回值,则语句return null,隐式地附加到函数体。
foo() {} assert(foo() == null);
类(Classes)
对象
Dart 是一种面向对象的语言,并且支持基于mixin的继承方式。
Dart 语言中所有的对象都是某一个类的实例,所有的类有同一个基类--Object。
基于mixin的继承方式具体是指:一个类可以继承自多个父类。
使用new语句来构造一个类,构造函数的名字可能是ClassName,也可以是ClassName.identifier, 例如:
var jsonData = JSON.decode('{"x":1, "y":2}'); // Create a Point using Point(). var p1 = new Point(2, 2); // Create a Point using Point.fromJson(). var p2 = new Point.fromJson(jsonData);
使用.(dot)来调用实例的变量或者方法。
var p = new Point(2, 2); // Set the value of the instance variable y. p.y = 3; // Get the value of y. assert(p.y == 3); // Invoke distanceTo() on p. num distance = p.distanceTo(new Point(4, 4));
使用?.来确认前操作数不为空, 常用来替代. , 避免左边操作数为null引发异常。
// If p is non-null, set its y value to 4. p?.y = 4;
使用const替代new来创建编译时的常量构造函数。
var p = const ImmutablePoint(2, 2);
使用runtimeType方法,在运行中获取对象的类型。该方法将返回Type 类型的变量。
print('The type of a is ${a.runtimeType}');
实例化变量(Instance variables)
在类定义中,所有没有初始化的变量都会被初始化为null。
class Point { num x; // Declare instance variable x, initially null. num y; // Declare y, initially null. num z = 0; // Declare z, initially 0. }
类定义中所有的变量, Dart语言都会隐式的定义 setter 方法,针对非空的变量会额外增加 getter 方法。
class Point { num x; num y; } main() { var point = new Point(); point.x = 4; // Use the setter method for x. assert(point.x == 4); // Use the getter method for x. assert(point.y == null); // Values default to null. }
构造函数(Constructors)
声明一个和类名相同的函数,来作为类的构造函数。