プログラミング言語Dartで知っておきたいことのまとめ

この記事では、Dartで知っておきたいことをまとめていく。

Dart の環境構築

以下のページを参考に構築すること。筆者の環境はUbuntu。

手順を以下にまとめる。

sudo apt-get update && sudo apt-get install apt-transport-https

wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub \
  | sudo gpg  --dearmor -o /usr/share/keyrings/dart.gpg

echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' \
  | sudo tee /etc/apt/sources.list.d/dart_stable.list

sudo apt-get update && sudo apt-get install dart

Hello world

まずはHello Worldをしよう。

// main.dart
void main() {
  print("hello world");
}

そして、以下のコマンドを実行する。

dart main.dart

すると実行される。

Dart自体はインタプリタ的にずぐに実行することもできれば、コンパイルしてから実行することもできる。

また、JavaScriptに変換することもできる!(なんだその機能は……)

変数定義

Dartの変数定義には、varの型推論が使える。 Kotlinのようにvalとかはない。

void main() {
  var sample = 14;
  print("This is ${sample}");
}
// This is 14 と表示される。

varではなく、型を定義して使うこともできる。 代表的なものを以下のコードで書いていく。

void main() {
  // 文字列
  String message = 'こんにちは';

  // 整数
  int count = 42;

  // 小数
  double temperature = 36.5;

  // 真偽値
  bool isCompleted = false;

  // リスト
  List<String> fruits = ['りんご', 'バナナ', 'オレンジ'];

  // マップ(辞書)
  Map<String, int> scores = {
    'Alice': 95,
    'Bob': 87,
    'Carol': 92
  };
}

定数 finalとconst

定数としては、finalconstが使える。

void main() {
  final String name = 'Alice';
  const double pi = 3.14159;
}

これらの定数は値が変更ができないことは同じだが、値が評価されるタイミングが異なる。

  • final 実行時に値が代入された時
  • const コンパイル時に決定する

多くの使い方はクラス内の定数などでfinalを使うことが多いだろう。

制御構文について

Dartの制御構文は以下の通り。1

if else

Dartはelse if派閥らしい。

void main() {
  int score = 85;

  if (score >= 90) {
    print('優秀!');
  } else if (score >= 70) {
    print('良好');
  } else if (score >= 60) {
    print('合格');
  } else {
    print('再試験');
  }
}

Switch case

breakが必要

void main() {
  String grade = 'B';

  switch (grade) {
    case 'A':
      print('素晴らしい!');
      break;
    case 'B':
      print('良いですね');
      break;
    default:
      print('評価不明');
  }
}

また、swtich文は以下のようにも書ける。

  var grade = "A";

  String message = switch (grade) {
    'A' => '素晴らしい!',
    'B' => '良いですね',
    'C' => '普通です',
    _ => '評価不明'  // defaultの代わりに_を使用
  };

for in

各要素はvarで型推論ができる。

void main() {
  List<String> colors = ['赤', '青', '緑'];

  for (var color in colors) {
    print('色: $color');
  }
}

また、Mapの場合だとforEachメソッドが使えて便利。

Map<String, int> scores = {
  '田中': 95,
  '山田': 87,
  '佐藤': 16
};

// キーと値を同時に処理
scores.forEach((name, score) {
  print('${name}: ${score}');
});

continue break

ループ処理の時、continuebreakが使える。 また、ラベル付きの処理もできる。

  outer: for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
      if (j == 1) {
        continue outer;  // 外側ループの次の繰り返しへ
      }
      print('i=$i, j=$j');
    }
  }

関数について

関数についてはTypeScriptっぽいかな。

int add(int a, int b) {
  return a + b;
}

void main(){
    var result = add(4, 6);
    print("結果は... ${result}");
}

シンプルなものなら、アロー関数で一行で書ける。これもJavaScriptっぽい。

int add(int a, int b) => a + b;

引数をオプションにできる。オプションのやり方は2種類ある。

  • [ ] 位置でオプションを指定する。
  • { } 名前でオプションを指定する。
// 名前付きオプション引数
void greet(String name, {String? greeting, int? times}) {
    // 省略...
}

greet("田中", greeting: "こんにちは!", times: 3);

// 位置オプション引数
void greet(String name, [String? greeting, int? times]) {
    // 省略...
}

greet('Hanako', 'Hi', 3);

デフォルト値を入れることも可能。

void createUser(String name, [int age = 0, String role = 'guest']) 

クラスについて

基本的なクラスの使い方は以下の通り。

class Person {
  // プロパティ(属性)
  String name;
  int age;

  // コンストラクタ(オブジェクトを作るときの設定)
  Person(this.name, this.age);

  // メソッド(動作・機能)
  void introduce() {
    print('私の名前は$nameで、${age}歳です。');
  }
}

void main() {
  // クラスからオブジェクトを作成
  Person person1 = Person('田中', 25);

  // メソッドを呼び出し
  person1.introduce(); // 出力:私の名前は田中で、25歳です。
}

クラスの基本的な仕組みについて

  • thisは省略できる。this.nameでもnameでもOK.
  • public, privateなどはない。
  • デフォルトでpublicメソッド。頭文字に_がついた場合はprivateになる。
  • 同じファイルなら、privateプロパティにもアクセスできる!
  • get setがある。

プロパティについて

プロパティは以下のように指定する。

class Person {
  String name;
  String country = '日本'; // デフォルト値を設定

  Person(this.name);
}

また、final修飾を使うことで、一度プロパティを設定すると、そのプロパティは変更できないようにできる。

class Person {
    final String name;
    Person(this.name);
}

コンストラクタについて

コンストラクタの基本的な書き方は以下の通り。 他の言語でもよくある書き方ではある。

class Person {
  String name;
  int age;

  // 基本的なコンストラクタ
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

void main() {
  Person person = Person('田中', 25);
}

簡潔な書き方として配下の書き方がある。 Dartではこちらの方が見かける。

class Person {
  String name;
  int age;

  // より簡潔な書き方
  Person(this.name, this.age);
}