dart语言:生成器、可调用类、isolates、typedefs、元数据注解、注释

2019-09-1410:46:06编程语言入门到精通Comments2,172 views字数 2569阅读模式

生成器文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

如果想延迟生成数值序列,可以使用生成器。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

  • 同步生成器 Synchronous,返回一个 Iterable 对象。
  • 异步生成器 Asynchronous,返回一个 Stream 对象。

实现同步生成器,需要使用 sync* 修饰方法,并用 yield 语句传递值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

Iterable<int> naturalsTo(int n) sync* {
  int k = 0;
  while (k < n) yield k++;
}
复制代码

实现异步生成器,需要使用 async* 修饰,并用 yield 语句传递值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

Stream<int> asynchronousNaturalsTo(int n) async* {
  int k = 0;
  while (k < n) yield k++;
}
复制代码

如果生成器是递归的,可以使用 yield* 来提高性能。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

Iterable<int> naturalsDownFrom(int n) sync* {
  if (n > 0) {
    yield n;
    yield* naturalsDownFrom(n - 1);
  }
}
复制代码

更多参考Dart Language Asynchrony Support: Phase 2文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

可调用类文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

实现 call() 方法的类可以当作方法来调用。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

class WannabeFunction {
  call(String a, String b, String c) => '$a $b $c!';
}

main() {
  var wf = new WannabeFunction();
  var out = wf("Hi","there,","gang");
  print('$out');
}
复制代码

更多参考Emulating Functions in Dart文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

isolates文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

为了发挥现代计算平台的多核计算能力,dart 中提供 isolates。和 threads不同的是,isolates 不共享内存状态,每个 isolate 都有自己的内存堆,保证isolate间不能互相访问状态,以避免代码复杂化和降低出错概率。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

更多参考dart:isolate library documentation文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

Typedefs文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

在 Dart 语言中,方法也是对象。 使用 typedef, 或者 function-type alias 来为方法命名, 然后可以使用命名的方法。 当把方法类型赋值给一个变量的时候,typedef 保留类型信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

不适用 typedef,当把 f 赋值给 compare 的时候, 类型信息丢失了。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

class SortedCollection {
  Function compare;

  SortedCollection(int f(Object a, Object b)) {
    compare = f;
  }
}

 // Initial, broken implementation.
 int sort(Object a, Object b) => 0;

main() {
  SortedCollection coll = new SortedCollection(sort);

  // 我们只知道 compare 是一个 Function 类型,
  // 但是不知道具体是何种 Function 类型?
  assert(coll.compare is Function);
}
复制代码

使用typedef保留类型信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

typedef int Compare(Object a, Object b);

class SortedCollection {
  Compare compare;

  SortedCollection(this.compare);
}

 // Initial, broken implementation.
 int sort(Object a, Object b) => 0;

main() {
  SortedCollection coll = new SortedCollection(sort);
  assert(coll.compare is Function);
  assert(coll.compare is Compare);
}
复制代码

注意:目前 typedefs 只能使用在 function 类型上,但是将来 可能会有变化。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

另外,typedef 只是别名,所以dart提供了一种判断任意 function 的类型的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

typedef int Compare(int a, int b);

int sort(int a, int b) => a - b;

main() {
  assert(sort is Compare); // True!
}
复制代码

元数据注解文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

使用元数据可以给代码添加额外的信息。元数据注解格式为 @+编译时常量(比如deprecated)/调用一个常量构造函数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

有三个注解所有的 Dart 代码都可以使用: @deprecated、 @override、 和 @proxy。@override 和 @proxy 示例请参考 Extending a class文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

class Television {
  /// _Deprecated: Use [turnOn] instead._
  @deprecated
  void activate() {
    turnOn();
  }

  /// Turns the TV's power on.
  void turnOn() {
    print('on!');
  }
}
复制代码

也可以自定义元数据注解文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

//定义注解
library todo;

class todo {
  final String who;
  final String what;

  const todo(this.who, this.what);
}

//使用注解
import 'todo.dart';

@todo('seth', 'make this do something')
void doSomething() {
  print('do something');
}
复制代码

元数据可以在 library、 class、 typedef、 type parameter、constructor、 factory、 function、 field、 parameter、或者variable 声明之前使用,也可以在 import 或者 export 指令之前使用。使用反射可以在运行时获取元数据 信息。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

注释文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

  • 单行注释以 // 开始。
  • 多行注释以 /* 开始, */ 结尾。 多行注释 可以 嵌套。
  • 文档注释可以使用 /// 开始, 也可以使用 /** 开始 并以 */ 结束。文档注释中,编译器忽略中括号以外的内容,中括号内可以引用classes、 methods、 fields、 top-level variables、 functions、 和 parameters。中括号里面的名字使用 当前注释出现地方的语法范围查找对应的成员。

作者:昵称真难选
来源:掘金文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/16442.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/16442.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定