Dart基础-函数

来源:互联网 发布:怎么安装软件字库 编辑:程序博客网 时间:2024/05/16 14:25

函数

下面是一个函数的例子

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);}
0 0