🌊
Dart3の新機能 RecordsとPatternsについて
今後のアップデート予定のDart3について
新機能であるRecordsとPatternsについて調べてみました。
リンク元
下記記事を参考に勉強しました。こちらのYouTubeも参考
Records
既存のデータから匿名の複合値を効率的かつ簡潔に作成することができ、新しいデータ構造を簡単に作成できる。
今までは簡単に複数の値を返すはできず、値を返すためにはクラスを作る必要があった。
→ クラスを宣言せずに複数の値を返すことができるようになった。
例
(double x, double y) geoLocation(String name) {
if (name == 'Nairobi') {
return (-1.2921, 36.8219);
} else {
...
}
}
geoLocationはdouble型のx,yのペアを返すことができる。
Patterns
複合データを構成要素に分解することができる。
→ 以下の例のように、複数の戻り値を個別の変数に分解することができる。(例:lat
とlong
)
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