Dart语言语法特性简介(2)

上一期主要介绍了dart和其他一些新语言比较类似的特性,这一期介绍一些dart里面独有,或者在其他语言里比较少看见的特性。


1.内置对fluent api的支持,中文翻译过来应该是链式调用,或者流式调用
目前很多语言的库都喜欢搞成fluent api,最知名的应该是jquery库了,实现也很简单,在方法最后返回this就可以。不过也有些时候实在没法返回this。
不过dart语言提供了内置的支持

void main() {
  querySelector('#sample_text_id')
    ..text = 'Click me!'
    ..onClick.listen(reverseText);
}

..操作符可以保证方法调用发生在一个对象上。


2.字符串内插,这个上期忘说了,其实也是很多语言都有的一个功能。目前编程语言中字符串处理的功能是越来越重要了。相比较于几十年前计算机多用于科学计算领域,现在估计用于数据处理,字符处理的程序会更多。

var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
assert(loudify('hello') == '!!! HELLO !!!');

3.内建的assert支持
不同于很多语言assert类似功能作为一个库的做法,dart的assert是作为语言特性实现的


4.命名构造器
dart的构造器可以命名,方便调用。不过感觉比较鸡肋,因为现在都是工厂模式创建比较常见。和这个的意义也差不多吧。

class Point {
  num x, y;

  Point(this.x, this.y);

  // 命令构造器,是不是和工厂模式很像?
  Point.origin() {
    x = 0;
    y = 0;
  }
}

5.常量构造器
快速实现单例模式的一种模式,话说现在在语言级别支持设计模式的是越来越常见了。比如kotlin的by组合模式,object单例模式,with构造器模式,company object 工厂模式,ruby的mixin组合模式….

class ImmutablePoint {
  static final ImmutablePoint origin =
      const ImmutablePoint(0, 0);

  final num x, y;
    #const构造器每次返回的实例都是同一个
  const ImmutablePoint(this.x, this.y);
}

6.工厂构造器
这个是隐式的一个工厂模式实现,提供了缓存功能(缓存是要自己实现的)

class Logger {
  final String name;
  bool mute = false;

  // 自己创建缓存,然后new的时候会隐式调用factory方法
  static final Map _cache =
      {};

  factory Logger(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final logger = new Logger._internal(name);
      _cache[name] = logger;
      return logger;
    }
  }

  Logger._internal(this.name);

  void log(String msg) {
    if (!mute) print(msg);
  }
}

7.空方法调用
应该是一种快速实现动态代理的方式,(就是静态语言都想变得更动态一点)

class A {
  // 覆盖此方法后,对未知方法的调用都会重定位到这里,然后你就可以做一些和java动态代理差不多的事情
  @override
  void noSuchMethod(Invocation mirror) {
    print('You tried to use a non-existent member: ' +
        '${mirror.memberName}');
  }
}

8.mixin
和ruby的mixin类似。
现在都是能不能单继承就不用单继承了(其实mixin就是一种变相的多继承)


9.异步特性
现在很多新语言或者框架都是因为对异步和并发的良好支持而火的,比如框架有netty,nodejs。语言有go,erlang。
我觉得随着今后网络设备越来越多,网络越来越发达。异步和并发编程会越来越重要。

//异步方法需要显式的标记为async
//await会等待方法返回后才回调,不过写起来就像是同步代码块一样。
Future checkVersion() async {
  var version = await lookUpVersion();
  // Do something with version
}

10.Metadata
类似java的注解


11.可调用的类,就是把类可以当做方法一样调用,没什么卵用,我记得kotlin也有。然后和js这种构造方法和普通方法不分的有点像。

你可能感兴趣的:(Dart语言语法特性简介(2))