Dart语言入门学习-函数(三)

dart是真正的面向对象语言,甚至函数也是一个对象,并且有一个类型Function,函数可以被赋值给变量或者作为参数传递给其他函数。 也可以把 Dart 类的实例当做方法来调用,下面定义一个函数

bool isNoble(int atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

但也可以省略类型声明

isNoble(atomicNumber) {
  return _nobleGases[atomicNumber] != null;
}

这样返回类型和参数的类型都省略了。但如果函数中只有一句表达式,也可以这样写

bool isNoble(int atomicNumber) => _nobleGases[atomicNumber] != null;

函数有两种参数类型: required 和 optional。 required 类型参数在参数最前面,因为他是必须的,后面可以跟optional类型参数,它类似于java中…,也就是可变参数。 命名的可选参数也可以标记为 “@ required” 。

可选参数

下面是函数的定义和调用

main() {
	enableFlags1( "123",  false);
  enableFlags2( bold: "123",  hidden: false);
  enableFlags3( "123",  "456");
  enableFlags3( "123");//device是可选函数,所以可有可没有
}

void enableFlags1(String bold, bool hidden) {//函数的定义
	print("$bold ok");
  print(hidden);
}
void enableFlags2({bold : String ,  hidden : bool}) {//函数的定义
	print(bold);
  print(hidden);
}
void enableFlags3( String bold,[String device]) {//函数的定义,device是可选函数
	print(bold);
}

在定义方法的时候,可以使用 = 来定义可选参数的默认值。 默认值只能是编译时常量。 如果没有提供默认值,则默认值为 null。

/// 设置 [bold] 和 [hidden] 标志 ...
void enableFlags({bool bold = false, bool hidden = false}) {...}

// bold 值为 true; hidden 值为 false.
enableFlags(bold: true);

下面在来定义一个有默认值的函数

main() {
	doStuff();
}
void doStuff({List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
  print('list:  $list');
  print('gifts: $gifts');
}

运行结果为

list:  [1, 2, 3]
gifts: {first: paper, second: cotton, third: leather}

main() 函数

任何应用都必须有一个顶级 main() 函数,作为应用服务的入口。这个没什么可说的

函数可以是一等对象

一个函数可以作为另一个函数的参数。

void main() {
  var list = [1, 2, 3];
  // 将 printElement 函数作为参数传递。
  list.forEach(printElement);
}

void printElement(int element) {
  print(element);
}

运行结果为

1
2
3

我们还可以把函数赋值给一个变量

void main() {
  var list = [1, 2, 3];
  var method = printElement(3);
  print(method);
}

int printElement(int element) {
 	return 100;
}

匿名函数

匿名函数定义如下

([[Type] param1[, …]]) { 
  codeBlock; 
}; 

有一个小括号,里面是参数,例如

  var list = ['apples', 'bananas', 'oranges'];
  list.forEach((item) {
    print('${list.indexOf(item)}: $item');
  });

如果匿名函数中只有一条语句,可以使用箭头

  var list = ['apples', 'bananas', 'oranges'];
 	list.forEach((item) => print('${list.indexOf(item)}: $item'));

词法作用域

作用域有全局的可局部的,就是函数内部可以访问函数外部的变量,但函数外部不能访问函数内部的变量,这个和java还有其他语言类似,没什么可说的

词法闭包

我们来先看一段代码

Function makeAdder(num addBy) {
  return (num i) => addBy + i;
}

void main() {
  // 创建一个加 2 的函数。
  var add2 = makeAdder(2);

  // 创建一个加 4 的函数。
  var add4 = makeAdder(4);

  print(add2(3));
  print(add4(3));
}

运行结果为

5
7

我们前面说个在dart语言中任何数字,函数都是一个对象,都可以赋值,我们上面把函数makeAdder赋值给变量add2,然后可以把add2当成一个函数来调用。

测试函数是否相等

void foo() {} // 顶级函数

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

void main() {
  var x;

  // 比较顶级函数。
  x = foo;
  print(foo == x);

  // 比较静态方法。
  x = A.bar;
  print(A.bar == x);

  // 比较实例方法。
  var v = A(); // A的1号实例
  var w = A(); // A的2号实例
  var y = w;
  x = w.baz;

  // 两个闭包引用的同一实例(2号),
  // 所以它们相等。
  print(y.baz == x);

  // 两个闭包引用的非同一个实例,
  // 所以它们不相等。
  print(v.baz == w.baz);
}

返回值

所有函数都会返回一个值。 如果没有明确指定返回值, 函数体会被隐式的添加 return null;

posted @ 2019-05-15 18:21  数据结构和算法  阅读(102)  评论(0编辑  收藏  举报