Dart 也想要甜甜的语法糖

检查一下你的Flutter项目里有多少这样的代码

if(xxx != null && xxx.isNotEmpty)

不得不说,我真的不喜欢这种先想条件,然后再想着在外面包一层 if 这种逆着思维顺序的代码方式(毕竟大家都活在「TENET」的世界里😏),尤其 if 里的条件比较长的时候。

消灭 == null

众所周知,dart 里有 ?.?? 这种判空操作符,于是上面的代码可以简化成这样:

String a = "dart";
if (a?.isNotEmpty ?? false) {
   print('😏');
}

但是还是好麻烦呐

封装一个扩展函数试试

给常用的类型添加 isNullOrEmpty 扩展函数

extension MapExtension on Map {
  bool get isNullOrEmpty => (this == null || this.isEmpty);
}

extension IterableExtension on Iterable {
  bool get isNullOrEmpty => (this == null || this.isEmpty);
}

extension StringExtension on String {
  bool get isNullOrEmpty => (this == null || this.isEmpty);
}

好了现在我们可以这样写:

String a = null;
if (!a.isNullOrEmpty) {
   print("😒");
} else print("Shit");

但是还有一种场景是不处理 null 的分支,只处理 empty or notEmpty

把 Kotlin 的方案搬过来,对bool类型加扩展函数

先写用法:

String a = "";
a?.isEmpty?.yes(() {
   print("Yes!");
})?.orElse(() {
   print("No! God No!");
})

如果你还是想要判断空分支,那还可以在后面加上??

看起来没有 kotlin 那么美观,但是至少不用写 if 了,代码实现在下面👇

class BooleanExt<T extends Object> {
  T orElse(T block()) {
    if (this is OrElse) {
      return block() ?? Null;
    } else {
      return (this as WithData).data ?? Null;
    }
  }
}

class OrElse extends BooleanExt<Object> {}

class WithData<T> extends BooleanExt<T> {
  final T data;

  WithData(this.data);
}

extension BoolExtension<T> on bool {
  BooleanExt yes(T block()) {
    if (this) {
      return WithData(block());
    } else {
      return OrElse();
    }
  }

  BooleanExt no(T block()) {
    if (this) {
      return OrElse();
    } else {
      return WithData(block());
    }
  }
}

以上代码都基于现在稳定版的语法,不过前段时间 Dart 发布了一个实验特性,加入了空安全的完整版

新版 Dart 的「空安全」

新的空安全机制改得和 Kotlin 一样了,直接分成「可空」和「不可空」两大类型,一个变量允许赋值为null就必须提前声明为不可空类型,各位可以在 https://nullsafety.dartpad.cn/ 这里玩一下。
在新版空安全下,上面的 isNullorEmpty 的实现和调用得改成这样:

extension IterableExtension on Iterable? {
  bool get isNullOrEmpty => (this == null || this!.isEmpty);
}
///
List<String>? a = null;
if (a.isNullOrEmpty) {
  print("DOG");
} else {
  print("Cat");
}

emmm,可以发现这个语言还是不太聪明的样子,我明明前面都写了 this == null ||, 后面调用还是要加上 ! 操作符强制认定不为空,在 Kotlin 里,这里就可以智能判断,Kotlin 真香🌝。

总结

Dart 虽然开始的时候比较简陋,但是一直在进步,有了扩展函数,有了严格的空安全,下一步是不是可以考虑支持 DSL 语法了😏

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345