🌊

Dart3の新機能 RecordsとPatternsについて

2023/02/19に公開

今後のアップデート予定のDart3について
新機能であるRecordsとPatternsについて調べてみました。

リンク元

下記記事を参考に勉強しました。
https://medium.com/dartlang/dart-3-alpha-f1458fb9d232
こちらのYouTubeも参考

Records

既存のデータから匿名の複合値を効率的かつ簡潔に作成することができ、新しいデータ構造を簡単に作成できる。
今までは簡単に複数の値を返すはできず、値を返すためにはクラスを作る必要があった。

→ クラスを宣言せずに複数の値を返すことができるようになった。

(double x, double y) geoLocation(String name) {
  if (name == 'Nairobi') {
    return (-1.2921, 36.8219);
  } else {
    ...
  }
}

geoLocationはdouble型のx,yのペアを返すことができる。

Patterns

複合データを構成要素に分解することができる。
→ 以下の例のように、複数の戻り値を個別の変数に分解することができる。(例:latlong)

void main(List<String> arguments) {
  final (lat, long) = geoLocation('Nairobi');
  print('Current location: $lat, $long');
}

patternsは 完全にタイプセーフ(型安全) であり、型が間違っていたらエラーで教えてくれる。
安全性が高い

pattern match

値の型に合わせて、パターンマッチを行うことができる。

switchを使って、各型に対する個別のフィールドにマッチングすることが可能に。
→構造化されたデータに対してより柔軟な操作が可能。

pattern matchの例 (calculateArea)
sealed class Shape {
}

class Square implements Shape {
  final double length;
  Square(this.length);
  
}

class Circle implements Shape {
  final double radius;
  Circle(this.radius);
}

double calculateArea(Shape shape) => switch (shape) {
  Square(length: var l) => l * l,
  Circle(radius: var r) => math.pi * r * r
};
};
  • capability controls
    クラスに対する新しい修飾子が追加される。

    以下いくつか紹介

    • interface class: 継承できないクラス
    • base class: 暗黙のインターフェースを無効化し、実装できないクラス
    • final class: 継承、実装、またはミックスインできないクラス(現在のライブラリ以外)
    • sealed class: 抽象クラス + final。継承された場合、サブタイプの積極的な宣言zが必要であり、switch文で使用される場合は、全ての可能なサブタイプを扱う必要があります。
    • mixin class: ミックスインとして使用されるクラス

現在のDartのバージョンにも寛容とのことです。

Discussion