ZetCode

Dart 函数

最后修改于 2025 年 6 月 8 日

Dart 函数教程展示了如何在 Dart 中使用函数。

Dart 函数定义

函数是将零个或多个输入参数映射到零个或多个输出参数。

使用函数的好处是

Dart 函数是一等公民。函数可以赋值给变量,作为参数传递给函数,或从函数返回。这使得语言更加灵活。

函数体由函数被调用时执行的语句组成。我们使用 return 关键字从函数返回. 函数体由一对花括号 {} 分隔. 调用函数时,我们指定其名称后跟圆括号 (). 函数可以接受也可以不接受参数。

Dart 函数简单示例

以下示例在 Dart 中创建了一个简单的函数。

main.dart
void main() {
  int x = 4;
  int y = 5;

  int z = add(x, y);

  print("Output: $z");
}

int add(int a, int b) {
  return a + b;
}

在本例中,我们定义了一个将两个值相加的函数。

void main() {

main 函数是程序的入口点。

int z = add(x, y);

我们调用 add 函数;它接受两个参数。计算出的值传递给 z 变量。

int add(int a, int b) {
    return a + b;
}

add 函数的定义以其返回类型开始。函数参数用逗号分隔;每个参数名称前面都带有其数据类型。函数被调用时执行的语句放在花括号之间。加法运算的结果使用 return 关键字返回给调用者。

print("Output: $z");

print 是一个内置的 Dart 函数,它将给定值打印到控制台。

$ dart main.dart
Output: 9

Dart main 函数参数

main 函数可以接受来自命令行的参数。

main.dart
void main(List<String> args) {
  print(args);
  print(args.length);

  if (args.length > 1) {
    var a = args[1];
    print(a);
  }
}

命令行参数存储在字符串列表 args 中。

$ dart main.dart 1 2 3 4 5
[1, 2, 3, 4, 5]
5
2

Dart 箭头函数

箭头函数允许我们创建一个由单个表达式组成的简化函数。我们可以省略花括号和 return 关键字。

main.dart
int add(int x, int y) => x + y;

int sub(int x, int y) => x - y;

void main() {
  print(add(3, 5));
  print(sub(5, 4));
}

在本例中,我们有两个使用箭头语法定义的函数。

$ dart main.dart
8
1

Dart 可选的位置参数

方括号 [] 用于指定可选的位置参数。

main.dart
void main() {
  print(pow(2, 2));
  print(pow(2, 3));
  print(pow(3));
}

int pow(int x, [int y = 2]) {
  int r = 1;
  for (int i = 0; i < 2; i++) {
    r *= x;
  }
  return r;
}

我们定义一个求幂函数。第二个参数是可选的;如果未指定,则使用其默认值来计算幂。

$ dart main.dart
4
4
9

Dart 可选的命名参数

可选的命名参数在花括号 {} 内指定。

main.dart
void main() {
  var name = "John Doe";
  var occupation = "carpenter";

  info(name, occupation: occupation);
}

void info(String name, {String occupation}) {
  print("$name is a $occupation");
}

info 函数将其第二个参数作为可选的命名参数。

info(name, occupation: occupation);

在传递可选的命名参数时,我们必须同时指定参数名称和值,并用冒号分隔。

$ dart main.dart
John Doe is a carpenter

Dart 匿名函数

我们可以创建匿名函数。匿名函数没有名称。

main.dart
void main() {
  var words = ['sky', 'cloud', 'forest', 'welcome'];

  words.forEach((String word) {
    print('$word has ${word.length} characters');
  });
}

我们创建了一个匿名函数,该函数计算列表中每个单词的字符数。

$ dart main.dart
sky has 3 characters
cloud has 5 characters
forest has 6 characters
welcome has 7 characters

Dart 递归函数

递归,在数学和计算机科学中,是一种定义方法的方式,其中被定义的方法在其自身定义中应用。换句话说,递归方法调用自身来完成其任务。递归是解决许多编程任务的广泛使用的方法。

一个典型的例子是计算阶乘。

main.dart
int fact(int n) {
  if (n == 0 || n == 1) {
    return 1;
  }

  return n * fact(n - 1);
}

void main() {
  print(fact(7));
  print(fact(10));
  print(fact(15));
}

在此代码示例中,我们计算了三个数字的阶乘。

return n * fact(n - 1);

fact 函数体内部,我们使用修改后的参数调用 fact 函数。该函数调用自身。

$ dart main.dart
5040
3628800
1307674368000

Dart 函数作为参数

Dart 函数可以作为参数传递给其他函数。这种函数称为高阶函数。

main.dart
int inc(int x) => ++x;

int dec(int x) => --x;

int apply(int x, Function f) {
  return f(x);
}

void main() {
  int r1 = apply(3, inc);
  int r2 = apply(2, dec);
  print(r1);
  print(r2);
}

在本例中,apply 函数将 incdec 函数作为参数。

int apply(int x, Function f) {
    return f(x);
    }

我们指定第二个参数是函数类型。

int r1 = apply(3, inc);
int r2 = apply(2, dec);

我们将 incdec 函数作为参数传递给 apply 函数。

$ dart main.dart
4
1

Dart 嵌套函数

嵌套函数,也称为内部函数,是在另一个函数内部定义的函数。

main.dart
void main() {
  String buildMessage(String name, String occupation) {
    return "$name is a $occupation";
  }

  var name = "John Doe";
  var occupation = "gardener";

  var msg = buildMessage(name, occupation);
  print(msg);
}

我们有一个在 main 函数内部定义的辅助 buildMessage 函数。

$ dart main.dart 
John Doe is a gardener

Dart 返回函数的函数 (闭包)

Dart 中的函数可以返回另一个函数。这允许您创建从其周围作用域捕获变量的闭包。

main.dart
Function makeAdder(int addBy) {
  return (int x) => x + addBy;
}

void main() {
  var add2 = makeAdder(2);
  var add5 = makeAdder(5);

  print(add2(3)); // 5
  print(add5(3)); // 8
}

makeAdder 函数返回一个将特定值添加到其参数的新函数。返回的函数会记住其创建上下文中的 addBy 值。

$ dart main.dart
5
8

Dart 命名参数的默认值

您可以在 Dart 函数中为命名参数提供默认值。这使得参数成为可选的,并在未提供时分配默认值。

main.dart
void greet(String name, {String greeting = 'Hello'}) {
  print('$greeting, $name!');
}

void main() {
  greet('Alice');
  greet('Bob', greeting: 'Hi');
}

greet 函数有一个名为 greeting 的命名参数,并带有默认值。如果未指定,则使用 'Hello'。

$ dart main.dart
Hello, Alice!
Hi, Bob!

Dart 函数 typedefs

Typedefs 允许您定义函数签名并将其用作类型,从而提高代码的可读性和类型安全性。

main.dart
typedef IntOperation = int Function(int, int);

int add(int a, int b) => a + b;
int mul(int a, int b) => a * b;

void printResult(int x, int y, IntOperation op) {
  print(op(x, y));
}

void main() {
  printResult(3, 4, add);
  printResult(3, 4, mul);
}

在这里,IntOperation 是一个接受两个整数并返回一个整数的函数的 typedef。我们使用它来指定 printResultop 参数的类型。

$ dart main.dart
7
12

来源

Dart 函数 - 语言参考

在本文中,我们学习了如何在 Dart 中使用函数。我们已经了解了如何定义函数、传递参数、使用可选参数以及如何创建高阶函数。函数是 Dart 编程的基本组成部分,能够实现代码重用和模块化设计。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 Dart 教程