🌏

Dart3のRecordについて

2023/06/21に公開

はじめに

Dart3から Record という機能が追加されました。
他の言語でいうところの タプル型 に相当します。
Dartの場合、複数の値を返却する場合は、Data classを使用することにより実現していました。
ただし、膨大な情報に関して言えばData classを用いることは適切ですが、
少ない情報量のData classをわざわざ用意することは冗長的です。
Record はこの冗長的になっているコードを救ってくれる、役目を果たす一つの手段となり得ます。

概要

Record式

late (String name, int age) record;
record = ('ma', 100);
  • Recordを変数として定義ができます。

関数

(String name, int age, String birthday, String comment) getGender(
  (String birthday, String comment) birthdayRecord,
) =>
    ('ma', 100, birthdayRecord.$1, birthdayRecord.$2);
    
final gender = getGender(('xx/xx', 'Happy Birthday!!'));
print(gender.$1);
print(gender.$2);
print(gender.$3);
print(gender.$4);
  • 関数として、返却値 / 引数にRecord型を指定することが可能です。
  • 呼び出し元では、$xのような位置フィールドを使用して値にアクセスします。
({String name, int age, String birthday, String comment}) getGender(
  (String birthday, String comment) birthdayRecord,
) =>
    (
      name: 'ma',
      age: 100,
      birthday: birthdayRecord.$1,
      comment: birthdayRecord.$2
    );
final gender = getGender(('xx/xx', 'Happy Birthday!!'));
print(gender.name);
print(gender.age);
print(gender.birthday);
print(gender.comment);
  • こちらは、名前付きフィールドとなるため、呼び出し元でも指定の値の名前フィールドから値にアクセスが可能です。
(String name, int age, String birthday, String comment) getGender(
  (String birthday, String comment) birthdayRecord,
) =>
    ('ma', 100, birthdayRecord.$1, birthdayRecord.$2);
    
final (name, age, birthday, comment) = getGender(('xx/xx', 'Happy Birthday!!'));
print(name);
print(age);
print(birthday);
print(comment);
  • 変数名自体をRecordの形式にすれば、呼び出し元で命名が可能です。
({String name, int age, String birthday, String comment}) getGender(
  (String birthday, String comment) birthdayRecord,
) =>
    (
      name: 'ma',
      age: 100,
      birthday: birthdayRecord.$1,
      comment: birthdayRecord.$2
    );
final (:name, :age, :birthday, :comment) = getGender(('xx/xx', 'Happy Birthday!!'));
print(name);
print(age);
print(birthday);
print(comment);
  • 変数名の前に:を記載すれば、同様に呼び出し元で命名が可能となります。

まとめ

普段から他の言語で、タプル型を使用している方には、とっつきやすいかもしれません。
便利な反面、用途を誤ると、呪文のようなコードになってしまうため、チーム間で連携して導入を検討していけたらなと思っております。

参考

https://dart.dev/language/records

Discussion