mirror of
https://github.com/falsycat/ar.falsy.cat.git
synced 2024-10-29 17:04:52 +00:00
103 lines
3.0 KiB
Markdown
103 lines
3.0 KiB
Markdown
|
---
|
|||
|
title: dart言語
|
|||
|
tags: [note, info-tech, development, programming-language]
|
|||
|
---
|
|||
|
|
|||
|
## 概要
|
|||
|
- Google製プログラミング言語
|
|||
|
- [flutter](note/info-tech/flutter.md)のための言語
|
|||
|
- 日本語資料少なめ
|
|||
|
- オブジェクト指向
|
|||
|
|
|||
|
## 特徴
|
|||
|
- undefined behaviorは無い
|
|||
|
- Null safety
|
|||
|
- 型名に?を付ければNull許容型になる
|
|||
|
- Null許容型に対してはNullチェックをしないとコンパイラがキレる
|
|||
|
- 整数値以外は参照型
|
|||
|
- GC(mark & sweep)搭載
|
|||
|
- デストラクタは無さそう,そもそもmark & sweepでデストラクタは信頼できない
|
|||
|
- コンストラクタが書きやすい
|
|||
|
- わざわざメンバ変数と同じ名前の引数を書いて,代入して,,,ということをしなくてもいい
|
|||
|
- 静的解析が強め
|
|||
|
|
|||
|
## 文法
|
|||
|
- 大体は既存のやつと同じ
|
|||
|
- 文末セミコロン必須
|
|||
|
- 関数呼び出しの実引数リストでもケツカンマ許容
|
|||
|
|
|||
|
### 変数修飾子
|
|||
|
- 型が自明な場合,型名は省略できる
|
|||
|
- 省略できる場合は省略することが推奨される
|
|||
|
|
|||
|
```dart
|
|||
|
// コンパイル時定数
|
|||
|
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許容型でないものとして扱える
|
|||
|
```dart
|
|||
|
(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チェックしてないのでコンパイルエラー
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
### コンストラクタ
|
|||
|
- C++と比べてかなり書きやすい
|
|||
|
|
|||
|
```dart
|
|||
|
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();
|
|||
|
}
|
|||
|
```
|