Search
dart言語
Last updated
Jun 21, 2023
# 概要
- Google製プログラミング言語
- flutterのための言語
- 日本語資料少なめ
- オブジェクト指向
# 特徴
- undefined behaviorは無い
- Null safety
- 型名に?を付ければNull許容型になる
- Null許容型に対してはNullチェックをしないとコンパイラがキレる
- 整数値以外は参照型
- GC(mark & sweep)搭載
- デストラクタは無さそう,そもそもmark & sweepでデストラクタは信頼できない
- コンストラクタが書きやすい
- わざわざメンバ変数と同じ名前の引数を書いて,代入して,,,ということをしなくてもいい
- 静的解析が強め
# 文法
- 大体は既存のやつと同じ
- 文末セミコロン必須
- 関数呼び出しの実引数リストでもケツカンマ許容
# 変数修飾子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| // コンパイル時定数
const int x = 0;
const x = 0;
// 再代入不可能変数
final int x = 0;
final x = 0;
// 再代入可能変数
var int x = 0;
var x = 0;
// 遅延初期化変数
late int x;
late final int x;
|
# final: 再代入不可能変数
- 値型の変数に対しては,値の変更を禁止する
- 参照型の変数に対しては,参照先の変更のみを禁止する
- dartでは,参照先のオブジェクトの変更を禁止することはできない
# late: 遅延初期化
- 変数の初期化を遅延させることができる
- 実質的にはNull safetyの無いNull許容型
late final
修飾子によって複数回の代入をコンパイルエラーにできる- ただし静的解析の精度は微妙なので,絶対に2回目の代入ができなくなるわけではない
# Null safety
- Null許容型に対しては,Nullを扱いやすくするための演算子が使える
- 関数の中で,変数に対して一度nullチェックをした場合,以降,その変数はNull許容型でないものとして扱える
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| (T? x) {
x ?? T(); // x が null ならば 0 それ以外ならば T()
x?.method(); // x が null ならば methodを呼ばずnullを返す それ以外ならば methodを呼ぶ
x!.method(); // x が nullでない ことを前提として methodを呼ぶ(実行時にnullだった場合runtime error)
};
(T? x) {
if (x == null) {
return;
}
x.method(); // x!.method(); とする必要がない
};
(T? x) {
x.method(); // Nullチェックしてないのでコンパイルエラー
};
|
# コンストラクタ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| class A {
final int x;
final int y;
final int z;
A(this.x, this.y, this.z);
A(this.x, {required this.y, this.z = 1});
A.empty() :
this.x = 0, this.y = 0, this.z = 0;
}
void main() {
final a1 = A(0, 1, 2);
final a2 = A(0, y: 1);
final a3 = A.empty();
}
|