Dart言語についての私的まとめ

A Tour of the Dart Languageを雑にまとめてみた

https://www.dartlang.org/guides/language/language-tour これを見てDart言語について雑にまとめてみた。

Important concepts 重要な概念

Dartの言語仕様

  • 変数に配置できるものはすべてオブジェクトである。関数,nullもオブジェクトである。
  • Dartは強く型付けされているが型推論できる
  • Listのようにジェネリクス型をサポートしている。 (Listに入れる方を制限)

デフォルト値

初期化されていない変数の初期値はnull。 整数値型の変数も初期値はnullである。

final と const

変数を変更するつもりがない場合はfinal or constを使う const変数はコンパイル時定数

final name = 'Bob'; 
final String nickname = 'Bobby';
const bar = 1000000; 
const double atm = 1.01325 * bar;

ビルドインタイプ

  • 数値
  • 文字列
  • bool
  • リスト
  • マップ
  • ルーン (UTF-32コードポイント)
  • シンボル

関数の引数

名前付きパラメータ

void enableFlags({bool bold, bool hidden}) {
  // ...
}
enableFlags(bold: true, hidden: false);

{}で囲むことで名前付き引数を定義できる

オプション引数

//device引数は呼び出し時になくても良い
String say(String from, String msg, [String device]) {
  // ...
}

で囲むことによってオプション引数になる。 で囲まれた引数は関数呼び出し時に指定しなくても呼ぶ出すことができる。 ほかの引数は指定しないとエラーになる

デフォルト引数

dartはデフォルト引数もサポートしている

void enableFlags({bool bold = false, bool hidden = false}) {
  // ...
}

String say(String from, String msg,
    [String device = 'carrier pigeon', String mood]) {
 //...
}

void doStuff(
    {List<int> list = const [1, 2, 3],
    Map<String, String> gifts = const {
      'first': 'paper',
      'second': 'cotton',
      'third': 'leather'
    }}) {
// ...
}

カスケード表記

同一オブジェクトに対して一連の操作を行う。 一時変数を作成する必要がないので読みやすいコードになる。

querySelector('#confirm')
  ..text = 'Confirm' 
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

条件付きメンバーアクセス

foo?.bar

fooがnullの場合nullを返し、そうでない場合barにアクセスする。

クラス

コンストラクター

クラス名と同じ関数を宣言することでコンストラクターを宣言できる インスタンス変数にコンストラクタ引数を割り当てるパターンは省略記法があるので、以下の様に書ける. また、名前付きコンストラクタを定義してクラスのコンストラクタを複数定義することもできる.

class Point {
  num x, y;

  Point(num x, num y) {
    this.x = x;
    this.y = y;
  }
}

class Point {
  num x, y;

  Point(this.x, this.y);

  // 名前付きコンストラクタ
  Point.origin() {
    x = 0;
    y = 0;
  }
}

スーパークラスのコンストラクタ、名前付きコンストラクタはサブクラスには継承されない。 なので、サブクラスで名前付きコンストラクタを使用する場合はそのコンストラクタをサブクラスに実装しないといけない。

Initializer list

コンスタラクタ本体が実行される前にインスタンス変数を初期化する事もできる。 :でイニシャライザを区切る

// 名前付きコンストラクタ
Point.fromJson(Map<String, num> json)
    : x = json['x'],
      y = json['y'] {
  print('In Point.fromJson(): ($x, $y)');
}

ゲッターセッター

ゲッターとセッターはオブジェクトのプロパティへの読み書きアクセスを提供するメソッド。それぞれのインスタンス変数には暗黙的にゲッターとセッターがあるが、getキーワードとsetキーワードを使用してgetter,setterを実装することもできる。

class Rectangle {
  num left, top, width, height;

  Rectangle(this.left, this.top, this.width, this.height);

  num get right => left + width;
  set right(num value) => left = value - width;
  num get bottom => top + height;
  set bottom(num value) => top = value - height;
}

抽象メソッド

// 抽象クラス定義
abstract class Doer {
  void doSomething(); //抽象メソッド
}

class EffectiveDoer extends Doer {
  void doSomething() {
    // ...
  }
}

クラス変数とクラスメソッド

staticキーワードを使用してクラス変数、クラスメソッド(静的変数、静的メソッド)を定義できる

class Point {
  num x, y;
  Point(this.x, this.y);

  static num distanceBetween(Point a, Point b) {
   //...
  }
}

void main() {
  var distance = Point.distanceBetween(a, b);
}

ライブラリの使用

importキーワードでライブラリを読み込むがオプションがいろいろ有る

asを用いることで接頭語を指定できる

import 'package:lib1/lib1.dart';
import 'package:lib2/lib2.dart' as lib2;

// Uses Element from lib1.
Element element1 = Element();

// Uses Element from lib2.
lib2.Element element2 = lib2.Element();

show,hideを使うことで一部だけの使用、不使用を指定できる

// fooだけを読み込む
import 'package:lib1/lib1.dart' show foo;

// foo以外を読み込む
import 'package:lib2/lib2.dart' hide foo;