0
点赞
收藏
分享

微信扫一扫

Dart语言入门学习-函数(三)

dart是真正的面向对象语言,甚至函数也是一个对象,并且有一个类型Function,函数可以被赋值给变量或者作为参数传递给其他函数。 也可以把 Dart 类的实例当做方法来调用,下面定义一个函数

bool isNoble(int atomicNumber) {
return _nobleGases[atomicNumber] != null;
}

但也可以省略类型声明

isNoble(atomicNumber) {
return _nobleGases[atomicNumber] != null;
}

这样返回类型和参数的类型都省略了。但如果函数中只有一句表达式,也可以这样写

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

函数有两种参数类型: required 和 optional。 required 类型参数在参数最前面,因为他是必须的,后面可以跟optional类型参数,它类似于java中…,也就是可变参数。 命名的可选参数也可以标记为 “@ required” 。

可选参数

下面是函数的定义和调用

main() {
enableFlags1( "123", false);
enableFlags2( bold: "123", hidden: false);
enableFlags3( "123", "456");
enableFlags3( "123");//device是可选函数,所以可有可没有
}

void enableFlags1(String bold, bool hidden) {//函数的定义
print("$bold ok");
print(hidden);
}
void enableFlags2({bold : String , hidden : bool}) {//函数的定义
print(bold);
print(hidden);
}
void enableFlags3( String bold,[String device]) {//函数的定义,device是可选函数
print(bold);
}

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

/// 设置 [bold] 和 [hidden] 标志 ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold 值为 true; hidden 值为 false.
enableFlags(bold: true);

下面在来定义一个有默认值的函数

main() {
doStuff();
}
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');
}

运行结果为

list:  [1, 2, 3]
gifts: {first: paper, second: cotton, third: leather}

main() 函数

任何应用都必须有一个顶级 main() 函数,作为应用服务的入口。这个没什么可说的

函数可以是一等对象

一个函数可以作为另一个函数的参数。

void main() {
var list = [1, 2, 3];
// 将 printElement 函数作为参数传递。
list.forEach(printElement);
}

void printElement(int element) {
print(element);
}

运行结果为

1
2
3

我们还可以把函数赋值给一个变量

void main() {
var list = [1, 2, 3];
var method = printElement(3);
print(method);
}

int printElement(int element) {
return 100;
}

匿名函数

匿名函数定义如下

([[Type] param1[, …]]) { 
codeBlock;
};

有一个小括号,里面是参数,例如

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) {
print('${list.indexOf(item)}: $item');
});

如果匿名函数中只有一条语句,可以使用箭头

var list = ['apples', 'bananas', 'oranges'];
list.forEach((item) => print('${list.indexOf(item)}: $item'));

词法作用域

作用域有全局的可局部的,就是函数内部可以访问函数外部的变量,但函数外部不能访问函数内部的变量,这个和java还有其他语言类似,没什么可说的

词法闭包

我们来先看一段代码

Function makeAdder(num addBy) {
return (num i) => addBy + i;
}

void main() {
// 创建一个加 2 的函数。
var add2 = makeAdder(2);

// 创建一个加 4 的函数。
var add4 = makeAdder(4);

print(add2(3));
print(add4(3));
}

运行结果为

5
7

我们前面说个在dart语言中任何数字,函数都是一个对象,都可以赋值,我们上面把函数makeAdder赋值给变量add2,然后可以把add2当成一个函数来调用。

测试函数是否相等

void foo() {} // 顶级函数

class A {
static void bar() {} // 静态方法
void baz() {} // 实例方法
}

void main() {
var x;

// 比较顶级函数。
x = foo;
print(foo == x);

// 比较静态方法。
x = A.bar;
print(A.bar == x);

// 比较实例方法。
var v = A(); // A的1号实例
var w = A(); // A的2号实例
var y = w;
x = w.baz;

// 两个闭包引用的同一实例(2号),
// 所以它们相等。
print(y.baz == x);

// 两个闭包引用的非同一个实例,
// 所以它们不相等。
print(v.baz == w.baz);
}

返回值

所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null;


举报

相关推荐

0 条评论