当前位置:   article > 正文

Dart语言语法特性简介(2)_dart assert方法

dart assert方法

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


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

void main() {
  querySelector('#sample_text_id')
    ..text = 'Click me!'
    ..onClick.listen(reverseText);
}
  • 1
  • 2
  • 3
  • 4
  • 5

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


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

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

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


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

class Point {
  num x, y;

  Point(this.x, this.y);

  // 命令构造器,是不是和工厂模式很像?
  Point.origin() {
    x = 0;
    y = 0;
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

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

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

  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);
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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

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

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


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

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

10.Metadata
类似java的注解


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/596153
推荐阅读
  

闽ICP备14008679号