🌏
Dart3のRecordについて
はじめに
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);
- 変数名の前に
:
を記載すれば、同様に呼び出し元で命名が可能となります。
まとめ
普段から他の言語で、タプル型を使用している方には、とっつきやすいかもしれません。
便利な反面、用途を誤ると、呪文のようなコードになってしまうため、チーム間で連携して導入を検討していけたらなと思っております。
参考
Discussion