Fork me on GitHub

Dart学习笔记 - 函数

Dart 是一个面向对象语言,方法也是对象并且具有一种类型,Function。这意味着,方法可以赋值给变量,也可以当作其他方法的参数。也可以把Dart类的实例当作方法来调用。

下面是定义方法的示例:

bool isEmpty(String str) {
    return str==null || str.isEmpty;
}

可以选择忽略类型定义,但推荐有返回类型的定义:

isEmpty(String str) {
    return str==null || str.isEmpty;
}

如果只有一个表达式,可以使用箭头语法:

bool isEmpty(String str) => str==null || str.isEmpty;

可选参数

可选命名参数

可以使用 paramName: value 来指定命名参数:

test(foo: false, bar: true);

定义方法的时候,使用{param1, param2, ...} 的形式来指定命名参数:

test({bool foo, bool far}){
    // ...
}

可选位置参数

把参数反倒[]中就变成可选位置参数:

void test(String s1, String s2, [String s3]) {
     print('$s1 - $s2 - $s3');
}

下面是不使用可选参数调用上面方法的示例:

test('a', 'b');

下面是使用可选参数调用上面方法的示例:

test('a', 'b', 'c');

默认参数值

定义方法的时候,可以使用=来定义可选参数的默认值。默认值只能是编译时常量。如果没有提供默认值,则默认值为null。 下面是设置可选参数默认值的示例:

test({bool foo = false, bool far = false}){
    // ...
}

void test2(String s1, String s2, [String s3 = '']) {
    // ... 
}

void test3(
{List list = const [1, 3], Map<String, String> map = const {'a': '1'}}) {
    // ...
}

入口函数

每个应用都需要有个顶级的 main() 入口方法才能执行。 main()方法的返回值为void并且有个可选的 List<String> 参数,该参数会接收命令行输入的参数数据。

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

方法也是一个对象

可以把方法当作另外一个方法的参数。例如:

var list = [1, 2, 3];
void printEle(ele) => print(ele);
void forEachPrint(List list, void f(var ele)) {
    for (var ele in list) {
        f(ele);
    }
}
forEachPrint(list, printEle);

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

Function test = (var msg) => print(msg);
test(123);
print(test is Function); // true

匿名方法

创建没有名称的方法,称为匿名方法(函数)。匿名函数可以赋值给变量,也可以当作参数使用。匿名函数的格式: ([[Type] param1[, …]]) {   codeBlock; }; 示例代码:

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

静态作用域

Dart 是静态作用域语言,基本上大括号里面定义的变量只能再大括号里面使用。


var topLevel = true;
main() {
    var insideMain = true;
    myFunction() {
        var insideFunction = true;
        nestedFunction() {
            var insideNestedFunction = true;
            assert(topLevel);
            assert(insideMain);
            assert(insideFunction);
            assert(insideNestedFunction);
        }
    }
}

闭包

闭包是一个方法对象,不管该对象在何处被调用,该对象都可以访问其作用域内的变量。 示例:

Function makeAddr(num addBy) {
    return (num i) => addBy + i;
}
void main(List<String> args) {
    var add1 = makeAddr(2);
    var add2 = makeAddr(3);
    print(add1(1)); // 3
    print(add2(2)); // 5
}