惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
The Last Watchdog
The Last Watchdog
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
A
Arctic Wolf
云风的 BLOG
云风的 BLOG
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
MyScale Blog
MyScale Blog
B
Blog
Spread Privacy
Spread Privacy
S
Schneier on Security
Project Zero
Project Zero
L
LINUX DO - 热门话题
M
MIT News - Artificial intelligence
F
Full Disclosure
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
Cyberwarzone
Cyberwarzone
AWS News Blog
AWS News Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
C
Cybersecurity and Infrastructure Security Agency CISA
Hugging Face - Blog
Hugging Face - Blog
Security Latest
Security Latest
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tailwind CSS Blog
K
Kaspersky official blog
Recent Announcements
Recent Announcements
NISL@THU
NISL@THU
Cisco Talos Blog
Cisco Talos Blog
S
Securelist
P
Privacy & Cybersecurity Law Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Exploit Database - CXSecurity.com
V
Visual Studio Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Webroot Blog
Webroot Blog

Dart

Dart 中的这个语法特性是什么时候推出的? deno 和 dart 好像啊 [转] Dart 服务器端开发 、 Dart 客户端开发 、Dart 浏览器端开发 和 Dart 云开发 用 Dart 重写了一个原本用 JavaScript 做的小应用 使用了下 Dart 语言,发现一些特性的设计得非常缜密,例如 List Comprehension js 转 dart 编译器哪家强? Fuchsia OS 预计还有 75 天后发布 凑热闹, dart 适合做后台吗 [Flutter/Dart] 关于 dart 异步任务执行顺序的问题 Flutter 资料分享 有没有 Dart 的大佬想要写书的,合作吗? - V2EX Dart/Flutter 资料精选 [转] 为什么 Flutter 会选择 Dart ? Dart 在 fuchsia os 上的应用
最近学习 Dart 语言,分享一下心得 (入门级)
QingXuJiaZhi · 2020-03-21 · via Dart

每隔一段时间,总有一种新(或较新)的语言进入大家的视线,比如 Kotlin, Rust, Go 等,我查了一下它们的 “出生日期”:

  • Rust (2011 自举, 2015 v1.0)
  • Go (2012, v1.0)
  • Kotlin (2012 开源, 2016 v1.0)
  • TypeScript (2014, v1.0)
  • Swift (2014, v1.0)
  • Dart/Flutter (2018, Dart v2.0)

由于 Dart 1 实质上已经被放弃,Dart 2 改动很大几乎就是一种新的语言,因此这里只列出 v2.0 的日期。

一个现象:这些新出的热门语言,都是静态类型语言,其原因可能是现代 IDE 发展起来了。 动态语言最大的优势是 “写起来省键盘”,但在类型推导与现代 IDE 的加持之下, 静态语言写起来不再繁琐,反而动态语言由于更难进行静态分析而难以享受 IDE 提供的更多好处。

言归正传,从上面各语言的日期可见,其中 Dart 2 非常新,这使得它有机会尽情吸收其它语言的经验, 反映出现代编程语言的很多新思想。下面开始说说 Dart 语言的特点。

一切皆对象

甚至连数字都是对象,比如下面的例子,数字可直接调用方法:

// int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1');

由于一切皆对象,所以任何变量的默认值都是 null,比如:

int n;
String s;
assert(n == null);
assert(s == null);

代码内测试 (inline testing)

直接在代码内写 assert(), 这个函数只在开发环境中有效,而在生产环境中会被忽略,非常适合用来做一些简单但重要的测试。

类型推导

以前的静态类型语言一般要求每次定义变量时,都明确写明类型,这非常繁琐。 而现在自动推导变量类型这个特性几乎成为了各种新语言的标配,不少老牌语言也在新版中加入这个特性。

var s = 'abc';
assert(s.runtimeType.toString() == 'String');

简化访问权限

不通过 public, protected, private 等关键词来表明成员是否对外公开,而是通过首字母来表示。 类似于 Golang, Golang 是用首字母大写表示 public, 但这被很多开发者诟病,确实会带来一些不便。 而 Dart 则是用首字母为下划线来表示 private, 这就比 Golang 那种设定舒服多了,也很符合直觉。

// 这个例子只是为了说明访问权限,并非最佳实践。
class MyClass {
  int _count;
  
  int get count => _count;
  set count(value) => _count = value;
}

是不是有点像 Python? 但与 Python 不同的是,_count 不是看起来像 private, 而是真的 private !

用问号语法来简化 null 相关操作

这也是新语言中比较流行的一种特性,确实非常好用。

int n;

// 此时 n == null, 可以赋值。
n ??= 3;
assert(n == 3);

// 此时 n != null,保留原来的值。
n ??= 5;
assert(n == 3);

print(1 ?? 3); // 结果为 1.
print(null ?? 5); // 结果为 5.
myObject?.someProperty

// 如果没有问号语法,就会麻烦很多:
(myObject != null) ? myObject.someProperty : null

关于 null 有一个故事,他的发明者曾说这是自己犯下的 “十亿美元错误”(billion-dollar mistake)。 但这么多年过去了,新语言明明有机会采用 “无 null” 设计,却还是选择了有 null, 侧面说明这个发明还是好处多过坏处。

处理列表的常用函数(流式处理)

比如 filter(在 Dart 里是 where), map, any, fold 等等,以前常见于动态类型语言,但由于这些函数确实很方便, 现在很多静态语言里也是标配特性了。

  numbers
    .where((n) => n % 2 == 0)
    .forEach((n) => print(n));

自动提供 getter, setter

在下面的例子中,xy 拥有默认的 getter 和 setter,非常方便。

class Point {
  num x, y;
  Point(this.x, this.y);
}

var p = Point(1.2, 3);
p.y = 2.5;
print('${p.x}, ${p.y}'); // "1.2, 2.5"

Kotlin 也有类似的特性。为什么在已经有了那么多编程语言的情况下,还要不断发明新的语言呢, 原因之一就是这些新特性非常优雅:写起来更方便,读起来更清晰。

异步编程

  • 据说是微软 C# 最先发明的 async/await 语法(我没有查证),用过都说好,甚至连 JavaScript 和 Python 都在版本升级中加入了这种语法。

  • 在本文开头列出的多种语言之中,Go 由于拥有独特的 goroutine 而不需要 async/await, 另外 Swift 虽然暂时没有这种语法,但开发者呼声很高,后续大概率会加上,列表中的其他语言全都已经具备这种语法了。

Future main() async {
  var ver = await getVersion();
  print('In main: version is $ver');
}

胖箭头函数

如果你曾经主要使用 JavaScript, 后来转到别的语言,那么你可能会很怀念那个可爱又实用的胖箭头。 在 Dart 里你可以再次愉快过使用它。

class MyClass {
  int value = 0;  
  void increase() => value++; 
}

串联语法 (Cascade)

Dart 自称是专为客户端(约等于前端)而设计的语言,而这个新颖、高效的串联语法很好地体现了什么叫做 客户端语言,这是 Dart 带给我最大的惊喜!

querySelector('#confirm')
  ..text = 'Confirm'
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

总结

以上列举了 Dart 的一部分特性,可以看出它吸收了很多新特性,同时考虑了别的语言的使用习惯, 学起来会有一种“似曾相识”的熟悉感,用起来会有一种“要啥有啥”的爽感。

再结合它的强大生命力:通过 Flutter 在手机端生存,通过编译为高质量的 JavaScript 代码在网页端生存, 通过编译为二进制可执行文件在桌面电脑端生存,同时也已经被 Google 官方确定为 Fuchsia 的主要编程语言之一。 因此,有兴趣的同学不妨学习一下。