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;
关注微信公众号“数据结构和算法”,查看更多算法题