Dart 1.12 リリースノート

# はじめに

8月31日にDart1.12がリリースされました。今回は大きな変更があったので、記事にまとめておきたいと思います。大分遅くなってしまいましたが…

# 1.12 リリース

リリースノートは[こちら](https://groups.google.com/a/dartlang.org/forum/#!topic/announce/PbbNSfEiNH0)です。

今回大きな変更としてNull-Aware Operatorの追加が上げられます。他にも、.package fileの追加などの更新があります。

# 言語仕様の変更

## Null-Aware Operator
これは、nullである可能性があるオブジェクトを扱う際にコードをシンプルにし、減らすのを手助けしてくれるものとなります。コードの読み書きの容易さを上げるために導入される、いわゆる糖衣構文です。

### ??

```dart
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になるようになっています。

### ??=

```dart
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](https://dartpad.dartlang.org/419f662adcac8a505fa0)の方に実行できるサンプルプログラムを作っておきましたので、是非試してみてください。
こちらも合わせてどうぞ。
[Seth Ladd's Blog: Null-aware operators in Dart](http://blog.sethladd.com/2015/07/null-aware-operators-in-dart.html)

## コアライブラリの変更

### dart:async

Streamを操作する```StreamController```クラスに```onListen```, ```onPause```, ```onResume```, ```onCancel``` のコールバックのsetterが追加されました。
[treamController class - dart:async library - Dart API](https://api.dartlang.org/1.12.0/dart-async/StreamController-class.html)

### dart:convert

Stringを行ごとに分割してくれる```LineSplitter```クラスに```split```というstatic methodが追加されました。

```dart
///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](https://api.dartlang.org/1.12.0/dart-convert/LineSplitter-class.html)

### dart:core

```Uri```がURIが作られた時に標準化を行うようになりました。また、```hasAbsolutePath```, ```hasEmptyPath```, ```hasScheme```プロパティが追加されました。
[Uri class - dart:core library - Dart API](https://api.dartlang.org/1.12.0/dart-core/Uri-class.html)

### dart:developer

Observatoryにログイベントを伝える```log```関数が追加されました。
[dart:developer library - Dart API](https://api.dartlang.org/1.12.0/dart-developer/dart-developer-library.html)

### dart:html

```setInnerHtml``` などのテキストからDOMを生成する関数を呼ぶ際に、NullTreeSanitizerを宣言するかわりとなるものとして、```NodeTreeSanitizer```に```const trusted```が追加されました。
[NodeTreeSanitizer class - dart:html library - Dart API](https://api.dartlang.org/133479/dart-html/NodeTreeSanitizer-class.html)

### dart:io

ファイルモードに、書き込みオンリー権限である```WRITE_ONLY```と```WRITE_ONLY_APPEND```が追加されました。
[FileMode class - dart:io library - Dart API](https://api.dartlang.org/133479/dart-io/FileMode-class.html)

### dart:isolate

```Isolate.spawnUri```関数に```onError```, ```onExit```, ```errorsAreFatal```パラメーターが追加されました。
[spawnUri method - Isolate class - dart:isolate library - Dart API](https://api.dartlang.org/133479/dart-isolate/Isolate/spawnUri.html)

### dart:mirrors

```InstanceMirror.delegate``` が ```ObjectMirror``` に移動しました。
[ObjectMirror class - dart:mirrors library - Dart API](https://api.dartlang.org/133479/dart-mirrors/ObjectMirror-class.html)

# 周辺ツールの変更

## .packages file

pub get、もしくはpub upgradeをした際に、.packagesというファイルが生成されるようになりました。これは、pubを利用する際に生成されるシンボリックリンクのかわりに使われるものとなります。
詳しくはSeth Ladd氏のこちらのブログ記事をご覧ください。
[Seth Ladd's Blog: New Dart SDK helps eliminates symlinks](http://blog.sethladd.com/2015/08/new-dart-sdk-eliminates-symlinks.html)

これからはシンボリックリンクを生成しなくても、コマンドラインで ```--packages=path/to/a/.packages```オプションを使うことで、dartを実行できるようになるようです。多分もうちょっとバージョンがあがると、.packagesを参照することがデフォルトになるのだと期待できます。時間があればその辺もまとめておきたいです。

## dartdoc

今までので作られていたAPI Docよりも、ロードが早く、見やすいAPI Docを作ってくれる[dartdoc](https://github.com/dart-lang/dartdoc)が、dartdocgenのかわりとして使われるようです。モバイルからのアクセスなどが改善されているとのことです。docgenとdartdocgenは、どちらも1.13でSDKから無くなるようです。

## dartfmt

50個以上のバグを改善し、複雑なコードでの行の最適化がより早く、より良いコードを生成するようになりました。

## Observatory

多くの機能が追加されました。詳細は[こちら](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#tool-changes)をご確認ください。

## 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リクエストが複数まとめて表示されるようになりました。
![サンプル画像](https://qiita-image-store.s3.amazonaws.com/0/34961/78e68e68-9a79-da2c-c7be-189d6a7df4b7.png)

↑のようになります。全ての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](https://github.com/dart-lang/sdk/blob/master/CHANGELOG.md#1120)を確認してみてください。

個人的には、今回の変更はnull-aware Operatorsの追加も大きいですが、.packagesファイルによりシンボリックリンクを生成しなくてもよくなることの方も結構注目点かなと思っています。Windowsでウィルスセキュリティ関係のソフトによってpubが参照できなくなる、みたいなこともありましたし…

ミスなどがありましたら、コメントなどで指摘していただけるとありがたいです。

----

参考

[Dart News &amp; Updates: Dart 1.12 Released, with Null-Aware Operators and more](http://news.dartlang.org/2015/08/dart-112-released-with-null-aware.html)