目录
Dart2是纯面相对象的语言,所以函数也是一个对象。
所有的函数都是基于类Function。
函数也可以作为参数,传入其他的函数中。
所有函数都有返回值,如果没有指定返回值,则返回null。
-
基本定义
函数的定义很简单,下面是一些简单的例子。
// 定义一个不带返回值的函数,可以带void, 也可以不带
void say(var word){
print("I say '${word}'";
}
// 参数可以不用指定类型,如果不指定,则默认是var
bool isInt(numVar){
return numVar is int;
}
// 如果函数只有一个return 语句可以用 => 简写
// 需要注意 => 后面只能是一个表达式或者是单条语句。
bool isInt2(numVar) => numVar is int;
main(){
say('hello world'); // I say 'hello world'
print(isInt('a')); // false
print(isInt(1)); // true
}
-
可选参数
函数允许定义可选的参数。
定义可选参数有两种方式一种使用{}, 另一种使用[]。区别就是, 如果用{}声明,在使用时必须带着参数名,如:a:123;如果用[]声明,在使用时需要按照顺序使用。
void travel({String from, String to}){
print("From ${from} to ${to}");
}
void travel2(String from, [String to, String city]){
print("From ${from} to ${to} and ${city}");
}
main(){
travel(); // From null to null
// 必须传入的是哪个参数的值
travel(to:"usa"); // From null to usa;
travel(from:"china", to:"usa") // From china to usa;
travel2("china"); // From china to null and null;
// 按照顺序传入参数值
travel2("china", "usa"); // From china to usa and null;
travel2("china", "usa", "england"); // From china to usa and england;
}
可选的参数,也是可以用@required指定可选的参数变成比填。要使用@required需要引入包 package:meta/meta.dart,如果是用flutter,则可以引入包package:flutter/material.dart。
void travel({@required String from , String to}){}
-
参数默认值
函数的参数可以用=来定义默认值,如果没有用=赋予默认值,那么参数默认值为null。
参数的默认值必须是编译时常量。
ps: 您可能见过用:来赋予参数默认值,这是老代码的使用方式,但是这个将在后续版本中去掉,所以最好还是用=。
void travel({String from="china", String to="usa"}){
print("From ${from} to ${to}");
}
// list和map的默认值需要用const修饰
void animals([List<String> names= const ["cat", "dog"], Map<String, String> nameMap = const{
"c": "cat",
"d": "dog"
}]){
print("animals: ${names}");
print("nameMap: ${nameMap}");
}
main(){
travel(); // From china to usa;
travel(from:"japan"); // From japan to usa;
animals(); // animals:['cat', 'dog'] nameMap: {'c', 'cat', 'd': 'dog'}
}
-
匿名函数
匿名函数的定义
([[Type] param1[, …]]) {
codeBlock;
};
main(List<String> args) {
var listVar = ["cat", 'dog'];
listVar.forEach((animal){
print("animal is ${animal}");
});
// 如果只有一行代码,可以使用=>
listVar.forEach((animal) => print("animal is ${animal}"));
}
-
作用域
Dart2语言的变量是有作用域的,变量的作用域是由代码布局决定的。下面是一个简单的例子。
var level1 = "level1";
main(List<String> args) {
var level2 = "level2";
// 定义一个内部函数
void testScope(){
var level3 = "level3";
print(level1); // level1
print(level2); // level2
print(level3); // level3
}
// 运行内部函数
testScope();
}
-
闭包
闭包是一个函数对象,可以读取其他作用域内的变量使用。
使用匿名函数可以轻松实现一个闭包。
// 本实例来自于官网
Function makeAdder(num){
return (addNum){
return addNum + num;
};
}
main(){
var add5 = makeAdder(5);
var add10 = makeAdder(10);
print(add5(1)); // 6
print(add10(1)); // 11
}
-
main函数
main函数是应用的入口。每一个应用都必须有一个Main函数作为入口。main函数没有返回值,并且有一个 List<String>类型的变量。
main(List<String> args) {
print(args)
}
// 运行命令 dart test.dart hello world
// 结果: [hello, world]