40
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dart その2Advent Calendar 2018

Day 22

Dartで鋭意検討中の新機能

Last updated at Posted at 2018-12-23

新機能案のリポジトリ

言語レベルでの新機能の課題、要求、解決策は下記GitHubリポジトリのissuesで管理されています。
dart-lang/language: Design of the Dart language

その前はDart Enhancement Proposal(DEP)でしたが変更になったようです。

現在開発中の新機能

上記の内state-activeラベルがついている機能を一言ずつ、簡単に紹介します。
比較的大きな改善が見込まれる項目が多く見られます。
Dart 2.0が出るまでは型安全(多くが静的)に専念する形でしたが、ようやく大物や新機能に手が出せるようになった、という感じですかね。

Set literal

Setのリテラルが書けるようになります。

var a = <int>{1, 2, 3};

Make it an error to use a type variable non-covariantly in a superinterface

省略 (^_^;)

Static Extension Methods

intとかStringとか、既存のクラスにメソッドが追加できるやつ。
Kotlinいいなー、という声に答えて。

Spread Collections
Control Flow Collections

Javascript(ES6)のスプレッド構文相当。
JavascriptにできてDartにできないのはDartのプライドが許さない?
後者は条件分岐とかも書けるように。
FlutterのWidgetで宣言的雰囲気を保ったままchildren:の要素を制御したりとか。
UIをdartで宣言的にも手続き的にも書けるのがFlutterのメリットだけど、現時点で宣言的表現力がJSXに劣る部分を補完。

Minimal Unicode grapheme cluster support
Minimal non-integer-index Unicode grapheme cluster support.

ぐらふぇむくらすたーって何だ? と思ったら、最近↓を読んだことを思い出したので、それでお茶を濁す。
C++標準化委員会、ついに文字とは何かを理解する: char8_t - Qiita

Constant Specification Update 2018

定数コンストラクタの初期化リストにおいて、コンストラクタ引数にisとかasを適用したものも定数式として扱うように。

class MyClass {
  final String value;
  const MyClass(Object o) : value = (o is! String) ? "$o" : (o as String);
}

あいかわらず定数コンストラクタの引数を使って他の定数コンストラクタを呼び出すことはできない。
Dartの定数は定数を内包できない? ⇒ Dart 2で出来るようになりました ⇒ なってませんでした - Qiita

Type aliases: Typedefs for non-function types

クラスをtypedef出来るように。今は関数型だけ。

Terminating Tokens

文末セミコロンを省略可能に。
KotlinやSwiftとの比較でとかく非難されがちだったし、JSへのアンチテーゼのつもりで必須にしたら、後発で省略可能なTypeScriptに人気で抜き去られたので。

Per Library Language Version Selection

Dart1→2マイグレーションとか、来たるNNBDマイグレーションとか用?

Sound non-nullable types with incremental migration

お待ちかねNull安全議論の再始動です。
KotlinやSwiftとの比較でとかく非難されがちだったし、JSに寄せたつもりですべてNull可にしたら、後発でNull安全なTypeScriptに人気で抜き去られたので。

Dart integers have no logical down-shift operator.

任意精度整数で(負数の)論理右シフトとかイミフということで一度消えた機能。
Dart2.0でintを任意精度から64bitに変更したときの復活し忘れ。
ちなみに、任意精度でも右シフトは定義できる。
正数ならfloor(x/2)、負数なら-floor(-x+1)/2)、0なら0

The async* function yield should work well with await for.

仕様に忠実な実装と、それによる高速化だそうな。
あれ、ここは仕様を議論する場所じゃなかったけ?

おわりに

気が向けば来年も。

現在開発中の新機能 (2018/12/31追記)

上記ではissuesのstate-activeラベルが付いたものを拾いましたが、language/workingというディレクトリがありました。ここにはissuesに挙がっていない機能も有りますし、state-activeは議論がアクティブであるのに対し、language/workingは開発がアクティブのようです。ドラフトのProposalとかも有ります。
language/workingに有ってstate-activeに無い機能を追加で紹介します。

Implicit Constructor

暗黙型変換用のコンストラクタ。
例えば、Uriを期待する文脈(API等)でStringを指定すると、implicitとマークされ、String引数をひとつだけ取るUriのコンストラクタが自動的に適用されます。

class Uri {
  // Note: parse is currently a static function on Uri, not a constructor.
  implicit Uri.parse(String uri) => ...
}

DartにはハンドクラフトなFutureOr<T>を除くUnionタイプが未実装ですが、その一部のユースケースが拾えそうです。
[1, 2, 3].map((x)=>(x*x))Iterableになってしまいますが、.toList()し忘れも適切に処理されそうです。

constコンストラクタも念頭にありますが、Dart 2.1で導入したEvaluating integer literals as double valuesとぶつかって曖昧になりそう。後者はint(64bit)で溢れるリテラルの解釈(本来の目的には無けど)等のきめ細かな対応があるので、こちらを優先する特別ルールが出来ると思います。

Shared immutable objects

いわゆるdataクラス。
とはいえ、機能名の通り、Isolate間で共有することが目的。

[Enhanced Type Promotion](https://github.com/dart-lang/language/pull/79 "Move over "Enhanced Type Promotion" proposal. by munificent · Pull Request #79 · dart-lang/language")

Object o;を仮定した時、if (o is String) {o.length();}が許されるのに、 if (o is! String) {} else {o.length();}が許されない等の対策。
improve type promotion in strong mode · Issue #25565 · dart-lang/sdkはどこまで拾われるんだろう。

現在開発中の新機能 (2019/1/21追記)

更に追加。
現在ProjectsにLanguage funnelというプロジェクトが一つだけあります。Funnelを直訳すると漏斗(じょうご)という意味ですが、フェーズゲート管理用という意味でしょうか。この最初のフェーズ"Being discussed"に、まだここで取り上げていない機能が3つありました。

Multiple return values

戻り値が複数書けるやつ。Swiftのタプル。Javascriptは配列とその分割代入でそれっぽくしているやつ。
そういえば、Dartに分割代入のアクティブな提案が無いなあ。
埋もれている提案はこちら。Destructuring · Issue #24 · dart-lang/dart_enhancement_proposals

[Experiment - Class annotation for disallowing use as a super-type, a.k.a "sealed classes"](https://github.com/dart-lang/language/issues/11 "Experiment - Class annotation for disallowing use as a super-type, a.k.a "sealed classes" · Issue #11 · dart-lang/language")

継承できないクラスを表すアノテーション。
現在int等の組み込み型の一部は特別ルールで継承不可だけど、フレームワーク等で定義する方法が無い。

Dart should support &&= and ||= operators.

説明不要ですね。というか、無かったんですね。

40
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?