はじめに
8月31日にDart1.12がリリースされました。今回は大きな変更があったので、記事にまとめておきたいと思います。大分遅くなってしまいましたが…
1.12 リリース
リリースノートはこちらです。
今回大きな変更としてNull-Aware Operatorの追加が上げられます。他にも、.package fileの追加などの更新があります。
言語仕様の変更
Null-Aware Operator
これは、nullである可能性があるオブジェクトを扱う際にコードをシンプルにし、減らすのを手助けしてくれるものとなります。コードの読み書きの容易さを上げるために導入される、いわゆる糖衣構文です。
??
print(null ?? "this is null") // this is null
var val = 1;
print(1 ?? "this is null") // 1
これは、if null operatorであり、 expr1 ?? expr2
は、もしexpr1がnullでなかったらexpr1を、nullだった場合はexpr2になるようになっています。
??=
var x = null;
x ??= "This is null";
??=は、nullだった場合の代入であり、 v ??= expr
は、vがnullだった場合のみ、vにexprを代入する式となります。
x?.p
x?.pはxがnullでなかった場合はx.pを、xがnullであった場合はnullを返します。
x?.m()
x?.m()はxがnullでなかった場合のみ、x.m()を実行します。もしxがnullだった場合も例外を投げません。
DartPadの方に実行できるサンプルプログラムを作っておきましたので、是非試してみてください。
こちらも合わせてどうぞ。
Seth Ladd's Blog: Null-aware operators in Dart
コアライブラリの変更
dart:async
Streamを操作するStreamController
クラスにonListen
, onPause
, onResume
, onCancel
のコールバックのsetterが追加されました。
treamController class - dart:async library - Dart API
dart:convert
Stringを行ごとに分割してくれるLineSplitter
クラスにsplit
というstatic methodが追加されました。
///Code Example
import "dart:convert";
void main() {
String text = "firstline\nSecondLine\nThirdLine";
var strings = LineSplitter.split(text);
var count = 1;
for(var line in strings){
print(count.toString() + " : " + line);
count++;
}
}
// Output
/// 1 : firstline
/// 2 : SecondLine
/// 3 : ThirdLine
LineSplitter class - dart:convert library - Dart API
dart:core
Uri
がURIが作られた時に標準化を行うようになりました。また、hasAbsolutePath
, hasEmptyPath
, hasScheme
プロパティが追加されました。
Uri class - dart:core library - Dart API
dart:developer
Observatoryにログイベントを伝えるlog
関数が追加されました。
dart:developer library - Dart API
dart:html
setInnerHtml
などのテキストからDOMを生成する関数を呼ぶ際に、NullTreeSanitizerを宣言するかわりとなるものとして、NodeTreeSanitizer
にconst trusted
が追加されました。
NodeTreeSanitizer class - dart:html library - Dart API
dart:io
ファイルモードに、書き込みオンリー権限であるWRITE_ONLY
とWRITE_ONLY_APPEND
が追加されました。
FileMode class - dart:io library - Dart API
dart:isolate
Isolate.spawnUri
関数にonError
, onExit
, errorsAreFatal
パラメーターが追加されました。
spawnUri method - Isolate class - dart:isolate library - Dart API
dart:mirrors
InstanceMirror.delegate
が ObjectMirror
に移動しました。
ObjectMirror class - dart:mirrors library - Dart API
周辺ツールの変更
.packages file
pub get、もしくはpub upgradeをした際に、.packagesというファイルが生成されるようになりました。これは、pubを利用する際に生成されるシンボリックリンクのかわりに使われるものとなります。
詳しくはSeth Ladd氏のこちらのブログ記事をご覧ください。
Seth Ladd's Blog: New Dart SDK helps eliminates symlinks
これからはシンボリックリンクを生成しなくても、コマンドラインで --packages=path/to/a/.packages
オプションを使うことで、dartを実行できるようになるようです。多分もうちょっとバージョンがあがると、.packagesを参照することがデフォルトになるのだと期待できます。時間があればその辺もまとめておきたいです。
dartdoc
今までので作られていたAPI Docよりも、ロードが早く、見やすいAPI Docを作ってくれるdartdocが、dartdocgenのかわりとして使われるようです。モバイルからのアクセスなどが改善されているとのことです。docgenとdartdocgenは、どちらも1.13でSDKから無くなるようです。
dartfmt
50個以上のバグを改善し、複雑なコードでの行の最適化がより早く、より良いコードを生成するようになりました。
Observatory
多くの機能が追加されました。詳細はこちらをご確認ください。
pub
pub getについて
今まで pub get
を前もって実行する必要があった多くのコマンドが、これからは実行する必要がなくなります。.packages
ファイルがpubspec.yaml
に比べて古くないか、というのを確認するためだけにpub get
を走らせればよいことになります。
--verbosity=error と --verbosity=warning
pubを実行する際のオプションとして、エラーだけを表示する--verbosity=error
オプションとエラーと警告だけを表示する --verbosity=warning
オプションが追加されました。
pub serve コマンドのoutput
pub serve
コマンドにて、GETリクエストが複数まとめて表示されるようになりました。
↑のようになります。全てのRequestを表示したい場合、--verbose
オプションを利用してください。
pub run , pub global run
pub run
とpub global run
を実行する際、チェックモードがデフォルトではなくなります。--checked
オプションを利用してください。
pub get
pub getは上記の通り、.packages
ファイルを生成するようになりました。また、ダウンロードにかかった時間を表示しなくなるようです。(何が理由なんでしょうかね...)
pub publish
pub publish
コマンドを実行している際、もしコードにエラーが発見された場合は0でないexitコードを返すようになりました。また、Gitのトップレポジトリでない場合にも、.gitignore
を適用するようになりました。
最後に
実際にコードを書く・Dartを使う際に重要そうな内容を上げてみました。こちらに書いていない・書けなかった更新もありますので、細部はCHANGELOGを確認してみてください。
個人的には、今回の変更はnull-aware Operatorsの追加も大きいですが、.packagesファイルによりシンボリックリンクを生成しなくてもよくなることの方も結構注目点かなと思っています。Windowsでウィルスセキュリティ関係のソフトによってpubが参照できなくなる、みたいなこともありましたし…
ミスなどがありましたら、コメントなどで指摘していただけるとありがたいです。
参考
Dart News & Updates: Dart 1.12 Released, with Null-Aware Operators and more