函数
下面是一个函数的例子
void printNumber(num number) {
print('The number is $number.');
}
虽然参考文档建议指定参数和返回值的类型,但是你可以不指定
printNumber(number) {
print('The number is $number.');
}
如果函数只有一个表达式,你可以使用速写语法
void printNumber(num number) => print('The number is $number.');
=> expr; 是 { return expr;} 的简写语法,下面是调用函数的例子
printNumber(123);
可选参数
一个函数可以有两种参数:可选的和必需的,必需参数放在前面,后面跟可选参数
可选参数可以是位置参数或命名参数,两种都可以有默认值,如果没有提供默认值则为null
可选的命名参数
定义一个函数,使用 {param1, param2, …} 指定命名参数,调用函数时,你可以指定使用命名参数 paramName: value
enableFlags({bool bold, bool hidden}) {
// ...
}
main(List<String> arguments) {
enableFlags(bold: true, hidden: false);
}
使用(:)指定默认值
enableFlags({bool bold: false, bool hidden: false}) {
// ...
}
main(List<String> arguments) {
enableFlags(bold: true);
}
可选的位置参数
把参数用 [ ] 包装起来,就能标识成位置参数
String say(String from, String msg, [String device]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
return result;
}
main(List<String> arguments) {
//无可选参数的调用
assert(say('Bob', 'Howdy') == 'Bob says Howdy');
//有可选参数的调用
assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');
}
使用 = 指定默认值
String say(String from, String msg, [String device = 'carrier pigeon', String mood]) {
var result = '$from says $msg';
if (device != null) {
result = '$result with a $device';
}
if (mood != null) {
result = '$result (in a $mood mood)';
}
return result;
}
main(List<String> arguments) {
assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');
}
main() 函数
每个程序都有main() 函数,作为程序的入口,返回值是void,还有一个可选参数
main(List<String> arguments) {
print(arguments);
print(arguments.length);
}
高阶函数
将函数作为参数传递给另一个函数
printElement(element) {
print(element);
}
main(List<String> arguments) {
var list = [1, 2, 3];
list.forEach(printElement);
}
将一个函数分配给一个变量
main(List<String> arguments) {
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');
}
作用域
dart的作用域跟其他语言一样,直接看一个例子
var topLevel = true;
main(List<String> arguments) {
var insideMain = true;
myFunction() {
var insideFunction = true;
nestedFunction() {
var insideNestedFunction = true;
assert(topLevel);
assert(insideMain);
assert(insideFunction);
assert(insideNestedFunction);
}
}
}
闭包
dart的闭包就是函数对象,其实跟JavaScript的闭包函数差不多,理论请参考JavaScript的闭包函数,这里直接写个例子
//返回一个函数对象,功能是返回累加的数字
Function makeAdder(num addBy) {
return (num i) => addBy + i;
}
main(List<String> arguments) {
//创建一个函数add2,add2返回2
var add2 = makeAdder(2);
//创建一个函数add4,add4返回4
var add4 = makeAdder(4);
//add2返回2+3
assert(add2(3) == 5);
//add4返回4+3
assert(add4(3) == 7);
}
函数是否相等
测试高阶函数、静态方法和实例方法是否相等
//一个高阶函数
foo() {}
class SomeClass {
//一个静态方法
static void bar() {}
//一个实例方法
void baz() {}
}
main(List<String> arguments) {
var x;
//比较高阶函数
x = foo;
assert(foo == x);
//比较静态方法
x = SomeClass.bar;
assert(SomeClass.bar == x);
//比较实例方法
var v = new SomeClass();
var w = new SomeClass();
var y = w;
x = w.baz;
assert(y.baz == x);
assert(v.baz != w.baz);
}