Dart 3.6の変更点とDart 3.7で追加される言語機能について

こんにちは。エキサイトでアプリエンジニアをしている岡島です。エキサイトホールディングス Advent Calendar 2024の17日目を担当させていただきます。

最近Dart 3.6がリリースされたので、Dart 3.6について見ていきたいと思います。また、DartCHANGELOGで、Dart 3.7.0で追加される言語機能が紹介されていたので、まとめていきたいと思います。

Dart 3.6の新機能

Announcing Dart 3.6. Welcome to Dart 3.6! Today is our last… | by Marya Belanger | Dart | Dec, 2024 | Mediumで紹介されていますが、日本語訳をしながらまとめていきたいと思います!

Pub workspaces機能

モノレポ環境での依存関係の管理を効率化する新機能です。

このPub workspacesの機能によって、グループ化されたパッケージ間の依存関係の競合が発生したときに解決する必要があり、パッケージの使用時に混乱することがなくなります。また、ワークスペース全体を単一の解析コンテキストとして扱われるようになり、Dart言語サーバーの消費メモリ量が大幅に削減され、IDEのパフォーマンスが向上するようです。

Pub workspacesを定義するには、ルートのpubspec.yamlファイルにworkspaceフィールドを追加し、関連するパッケージを記述します。

name: _
publish_to: none
environment:
  sdk: ^3.6.0
workspace:
  - packages/helper
  - packages/client_package
  - packages/server_package

次に、リポジトリ内の任意の場所で実行pub getして、マッピングと残りのファイル管理を完了します。pub ワークスペースを使用するには、すべてのワークスペースパッケージ(依存関係を除く)のSDKバージョン制約が^3.6.0以上である必要があります。

pub.devのダウンロード数表示

pub.devでダウンロード数が確認できるようになりました。

ダウンロード数は、個々のパッケージページにおける以前の「人気スコア」に置き換わるものです。 週ごとのダウンロード数も時系列で示されます。

Digit Separators

長い数値リテラルの可読性を向上させるために、 アンダースコア(_)を数値の区切り文字として使用できるようになりました。

以下、例です。

1__000_000__000_000__000_000
0x4000_0000_0000_0000
0.000_000_000_01
0x00_14_22_01_23_45

Digit Separatorsは数字間でのみ有効であるため、 0._000_1 、1.2e_3100_などは使用できないことに注意してください。 Digit Separatorsを使用するには、パッケージ内の最小SDK^3.6.0以上にする必要があります。

Dart 3.7で追加予定の機能

ここから先はhttps://github.com/dart-lang/sdk/blob/main/CHANGELOG.md#370に記載されている、Dart 3.7.0の言語機能について共有していきます。

ワイルドカード変数 (Wildcard Variables)

ローカル変数やパラメーターとして_という名前を使用することで、 非バインディング変数を作成できるようになります。ワイルドカード変数はバインディングされないため、ワイルドカード変数を複数回宣言しても、名前衝突することなく、宣言できるようになります。

以下ワイルドカード変数を使用できる例:

Foo(_, this._, super._, void _()) {}

main() {
  var _ = 1;
  int _ = 2;

  list.where((_) => true);
}

その他、Nullへの型昇格やAnalyzerやDart formatの変更点がありますが、Dart 3.7の主な機能追加はワイルドカード変数のようです。

最後に

今回はDart 3.6がリリースされたので、こちらの記事を元に記事を書いてみました。このような言語機能追加のMotibationを読んでみると、確かにそうだと思う部分があり、勉強になりました。

最後まで読んでいただきありがとうございました。