模式切换
函数方法
Dart 中的函数是第一类对象,可以赋值给变量或作为参数传递。函数的设计灵活,支持可选参数、匿名函数、箭头函数、闭包等特性。
函数的定义与调用
定义函数
- 使用
returnType functionName(parameterList)
语法定义函数。 - 函数可以有返回值,也可以没有(使用
void
) - 如果没有指定返回值类型,则默认为
dynamic
。请注意,函数的返回值类型不能使用类型推断。
dart
// 没有指定返回值类型,默认为 dynamic
exampleFunction() {
return 'This is a string';
}
void main() {
var result = exampleFunction();
print(result); // 输出: This is a string
}
// 请注意,函数的返回值类型不能使用类型推断。
// 错误示例:不能使用类型推断来声明函数的返回值类型
// var exampleFunction() {
// return 'This is a string';
// }
调用函数
- 使用函数名和参数列表调用。
dart
sayHello(); // 输出: Hello, Dart!
print(add(3, 5)); // 输出: 8
可选参数与默认参数
可选命名参数
- 使用
{}
包裹参数表示命名参数。 - 调用时必须明确指定参数名。
- 必须在必选参数后面定义。
- 可选命名参数和可选位置参数不能同时使用。
示例:
dart
void greet({String? name, int? age}) {
print('Hello, $name! You are $age years old.');
}
greet(name: 'Alice', age: 30); // 输出: Hello, Alice! You are 30 years old.
默认参数
- 给命名参数设置默认值。
dart
void greet({String name = 'Guest', int age = 18}) {
print('Hello, $name! You are $age years old.');
}
greet(); // 输出: Hello, Guest! You are 18 years old.
可选位置参数
- 使用
[]
包裹参数表示位置参数。 - 必须在必选参数后面定义。
- 可选位置参数和可选命名参数不能同时使用。
示例:
dart
void describe(String name, [int? age]) {
print('$name is $age years old.');
}
describe('Bob'); // 输出: Bob is null years old.
describe('Alice', 25); // 输出: Alice is 25 years old.
匿名函数和箭头函数
匿名函数
- 匿名函数可以直接赋值给变量或作为参数传递。
示例:
dart
var multiply = (int a, int b) {
return a * b;
};
print(multiply(3, 4)); // 输出: 12
箭头函数
- 当函数体只有一条语句时,可以用箭头语法简化函数定义。
- 使用
=>
替代{}
和return
。
示例:
dart
int square(int x) => x * x;
print(square(5)); // 输出: 25
闭包
闭包是能够捕获其作用域范围内变量的函数。即使作用域结束,这些变量仍然可以被访问。
闭包的概念
- 函数内部定义的函数可以访问外部函数的局部变量。
示例:
dart
Function makeAdder(int addBy) {
return (int i) => i + addBy;
}
void main() {
var add2 = makeAdder(2);
var add5 = makeAdder(5);
print(add2(3)); // 输出: 5
print(add5(3)); // 输出: 8
}
闭包的作用
闭包允许函数持久化存储状态,适用于回调函数、状态管理等场景。