Skip to content

函数方法

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
}

闭包的作用

闭包允许函数持久化存储状态,适用于回调函数、状态管理等场景。

编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!