Dart 是一种真正面向对象的语言,所以即便函数也是对象并且类型为 Function,这意味着函数可以被赋值给变量或者作为其它函数的参数。你也可以像调用函数一样调用 Dart 类的实例。详情请查阅 可调用的类。
下面是定义一个函数的例子:
虽然高效 Dart 指南建议在 公开的 API 上定义返回类型,不过即便不定义,该函数也依然有效:
main(List<String> args) {
int number = 5;
if (isPrime(number)) {
print("$number是素数");
} else {
print("$number不是素数");
}
}
isPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}
如果函数体内只包含一个表达式,你可以使用简写语法:
bool isPrimeHandler(int number) => isPrime(number) ? true : false;
语法 => 表达式 是 { return 表达式; } 的简写, => 有时也称之为 箭头 函数。
参数
函数可以有两种形式的参数:必要参数 和 可选参数。必要参数定义在参数列表前面,可选参数则定义在必要参数后面。可选参数可以是 命名的 或 位置的。
命名参数
命名参数默认为可选参数,除非他们被特别标记为 required。
当你调用函数时,可以使用 参数名: 参数值 的形式来指定命名参数。例如:
getUserInfo2(name, age: age, gender: gender);
定义函数时,使用 {参数1, 参数2, …} 来指定命名参数:
void getUserInfo2(String username, {var age, var gender}) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }
虽然命名参数是可选参数的一种类型,但是你仍然可以使用 required 来标识一个命名参数是必须的参数,此时调用者必须为该参数提供一个值。例如:
void getUserInfo2(String username, {required var age, var gender}) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }
如果调用这个函数的时候没有提供age参数,那么编译的时候就会产生报错
可选的位置参数
使用 [] 将一系列参数包裹起来作为位置参数:
void getUserInfo(String username, [var age, var gender]) { if (age != null && gender != null) { print(“name:$username,age:$age,gender:$gender”); } else { print(“name:$username,age and gender is private”); } }
只传入必须参数进行调用
String name = ‘yxr’; getUserInfo(name);
传入必须参数的同时,传入可选参数进行调用
String name = ‘yxr’; getUserInfo(name, age, gender);
默认参数值
可以用 = 为函数的命名参数和位置参数定义默认值,默认值必须为编译时常量,没有指定默认值的情况下默认值为 null。
*只传入必须参数进行调用
main(List<String> args) {
String name = 'yxr';
int age = 19;
String gender = "男";
getUserInfo(name);
}
void getUserInfo(String username, [var age = 18, var gender = "男"]) {
print("name:$username,age:$age,gender:$gender");
}
结果:
*传入必须参数和可选参数
main(List<String> args) {
String name = 'yxr';
int age = 19;
String gender = "男";
getUserInfo(name, age, gender);
}
void getUserInfo(String username, [var age = 18, var gender = "男"]) {
print("name:$username,age:$age,gender:$gender");
}
结果:
main() 函数
每个 Dart 程序都必须有一个 main() 顶级函数作为程序的入口, main() 函数返回值为 void 并且有一个 List
下面是一个简单 main() 函数:
main(){
print("Hello,World");
}
函数是对象
可以将函数作为参数传递给另一个函数。例如:
main(List<String> args) {
var list = [1, 2, 3, 4];
list.forEach(printElement); // forEach函数接收的是一个函数作为参数
}
void printElement(int value) {
print(value);
}
运行结果:
你也可以将函数赋值给一个变量,比如:
main(List<String> args) {
printer();
}
var printer = () => print("Hello,World");
运行结果: