ar.falsy.cat/content/note/info-tech/dart.md
2023-06-21 07:36:18 +09:00

3.0 KiB
Raw Blame History

title tags
dart言語
note
info-tech
development
programming-language

概要

  • Google製プログラミング言語
  • flutterのための言語
  • 日本語資料少なめ
  • オブジェクト指向

特徴

  • undefined behaviorは無い
  • Null safety
    • 型名に?を付ければNull許容型になる
    • Null許容型に対してはNullチェックをしないとコンパイラがキレる
  • 整数値以外は参照型
  • GCmark & sweep搭載
    • デストラクタは無さそうそもそもmark & sweepでデストラクタは信頼できない
  • コンストラクタが書きやすい
    • わざわざメンバ変数と同じ名前の引数を書いて,代入して,,,ということをしなくてもいい
  • 静的解析が強め

文法

  • 大体は既存のやつと同じ
  • 文末セミコロン必須
  • 関数呼び出しの実引数リストでもケツカンマ許容

変数修飾子

  • 型が自明な場合,型名は省略できる
    • 省略できる場合は省略することが推奨される
// コンパイル時定数
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許容型でないものとして扱える
(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++と比べてかなり書きやすい
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();
}