且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Dart基础-函数

更新时间:2022-09-16 21:22:01

函数

下面是一个函数的例子

void printNumber(num number) {
  print('The number is $number.');
}

虽然参考文档建议指定参数和返回值的类型,但是你可以不指定

printNumber(number) {
  print('The number is $number.');
}

如果函数只有一个表达式,你可以使用速写语法

void printNumber(num number) => print('The number is $number.');

=> expr; 是 { return expr;} 的简写语法,下面是调用函数的例子

printNumber(123);

可选参数

一个函数可以有两种参数:可选的和必需的,必需参数放在前面,后面跟可选参数
可选参数可以是位置参数或命名参数,两种都可以有默认值,如果没有提供默认值则为null

可选的命名参数

定义一个函数,使用 {param1, param2, …} 指定命名参数,调用函数时,你可以指定使用命名参数 paramName: value

enableFlags({bool bold, bool hidden}) {
  // ...
}

main(List<String> arguments) {
  enableFlags(bold: true, hidden: false);
}

使用(:)指定默认值

enableFlags({bool bold: false, bool hidden: false}) {
  // ...
}

main(List<String> arguments) {
  enableFlags(bold: true);
}

可选的位置参数

把参数用 [ ] 包装起来,就能标识成位置参数

String say(String from, String msg, [String device]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  return result;
}

main(List<String> arguments) {
  //无可选参数的调用
  assert(say('Bob', 'Howdy') == 'Bob says Howdy');
  //有可选参数的调用
  assert(say('Bob', 'Howdy', 'smoke signal') == 'Bob says Howdy with a smoke signal');
}

使用 = 指定默认值

String say(String from, String msg, [String device = 'carrier pigeon', String mood]) {
  var result = '$from says $msg';
  if (device != null) {
    result = '$result with a $device';
  }
  if (mood != null) {
    result = '$result (in a $mood mood)';
  }
  return result;
}

main(List<String> arguments) {
  assert(say('Bob', 'Howdy') == 'Bob says Howdy with a carrier pigeon');
}

main() 函数

每个程序都有main() 函数,作为程序的入口,返回值是void,还有一个可选参数

main(List<String> arguments) {
  print(arguments);
  print(arguments.length);
}

高阶函数

将函数作为参数传递给另一个函数

printElement(element) {
  print(element);
}

main(List<String> arguments) {
  var list = [1, 2, 3];
  list.forEach(printElement);
}

将一个函数分配给一个变量

main(List<String> arguments) {
  var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
  assert(loudify('hello') == '!!! HELLO !!!');
}

作用域

dart的作用域跟其他语言一样,直接看一个例子

var topLevel = true;

main(List<String> arguments) {
  var insideMain = true;

  myFunction() {
    var insideFunction = true;

    nestedFunction() {
      var insideNestedFunction = true;

      assert(topLevel);
      assert(insideMain);
      assert(insideFunction);
      assert(insideNestedFunction);
    }
  }
}

闭包

dart的闭包就是函数对象,其实跟JavaScript的闭包函数差不多,理论请参考JavaScript的闭包函数,这里直接写个例子

//返回一个函数对象,功能是返回累加的数字
Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

main(List<String> arguments) {
  //创建一个函数add2,add2返回2
  var add2 = makeAdder(2);

  //创建一个函数add4,add4返回4
  var add4 = makeAdder(4);

  //add2返回2+3
  assert(add2(3) == 5);
  //add4返回4+3
  assert(add4(3) == 7);
}

函数是否相等

测试高阶函数、静态方法和实例方法是否相等

//一个高阶函数
foo() {}

class SomeClass {
  //一个静态方法
  static void bar() {}
  //一个实例方法
  void baz() {}
}

main(List<String> arguments) {
  var x;

  //比较高阶函数
  x = foo;
  assert(foo == x);

  //比较静态方法
  x = SomeClass.bar;
  assert(SomeClass.bar == x);

  //比较实例方法
  var v = new SomeClass();
  var w = new SomeClass();
  var y = w;
  x = w.baz;

  assert(y.baz == x);
  assert(v.baz != w.baz);
}