新機能案のリポジトリ
言語レベルでの新機能の課題、要求、解決策は下記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.
説明不要ですね。というか、無かったんですね。