水無瀬のプログラミング日記

プログラムの勉強した時のメモ

Dart事始め

はじめに

Dartが気になっている今日このごろ。
気になっているなら触ってみようという回。

TL;DR.

ソースコード

インストール

# dart 本体のinstall
$ brew tap dart-lang/dart
$ brew install dart

# cliツールinstall
$ pub global activate stagehand

プロジェクト作成

$ mkdir dart-sample
$ cd dart-sample
$ stagehand console-full
> 下記のようなファイルが生成される
.
├── CHANGELOG.md
├── README.md
├── analysis_options.yaml
├── bin
│   └── main.dart
├── lib
│   └── dart_sample.dart
├── pubspec.yaml
└── test
    └── dart_sample_test.dart

生成されたファイル確認

bin/main.dart

メインになるDartファイル。
トップレベルのmain()関数を含む。これがアプリケーションのエンドポイントになる。

lib/dart_sample.dart

追加のDartファイル。
main.dartからimportされる関数などを含む。

pubspec.yaml

metadataやインストールしたpackageの情報が記載される。
npmで言うとこのpackage.jsonだと思う。

packageインストール

pub getでOK。
npmで言うとこのnpm installと同じだと思う。
インストールするとpubspec.lockというファイルも生成される。
依存関係と依存しているバージョンが記載されている。
これもpackage-lock.jsonと同じだと思う。

実行してみる

ビルドなどは特に不要なので、叩けばOK。

$ dart bin/main.dart
> Hello world: 42!

ファイルを変更してみる

lib/dart_sample.dartを下記のように変更する。

int calculate() {
  return -1;
}

変更が反映されていることの確認する

$ dart bin/main.dart
> Hello world: -1!

出力される内容がちゃんと変わっていることが確認できる。

プロダクション用ビルドをする

さっきやったようにビルドをしなくても動くが、AOTコンパイルがかけられるのでやってみる。

# ビルド
$ dart2aot bin/main.dart bin/main.dart.aot
> なにも表示されないがファイルができていればOK

# 実行してみる
$ dartaotruntime bin/main.dart.aot
> Hello world: -1!

基本構文まとめ

とりあえず動かすことはできたので、公式サイトを参考にしながら基本構文をまとめておく。

基本的にはどこにもあるような感じ。
型推論をしてくれるので、指定しなくても大丈夫。

// 型は推論してくれるので指定しなくてもOK
var number = 42;
// 指定すればそれになる
String hoge = 'hoge';
bool isHuga = false;
int intNumber = 10;
double doubleNumber = 3.141592;
List<String> list = ['hoge', 'huga', 'piyo'];
Map<String, String> map = {'key1': 'hoge', 'key2': 'huga', 'key3': 'piyo'};
Set<String> set = {'hoge', 'huga', 'piyo'};

Objectとdynamic

DartにはTSで言うanyJavaで言うObjectを指定するのに2つある。
Effective Dartによると本当になんでもいい場合はObject
A or Bの型が欲しいとかの場合はdynamicを使う。

// 型がなんでも良い場合は`Object`を使う
Object obj = 'なんでもいい場合';
// AかBの型が欲しいけどって言う場合は`dynamic`を使う
dynamic dynamicVariable = '限定したい場合';

finalとconst

どっちも指定することで再代入を禁止できる。
ざっくり言うと、finalはjsのconst
constは更にObject.freeze()をした状態。
ただし、jsと違ってリストにも効く。

// 型がなんでも良い場合は`Object`を使う
Object obj = 'なんでもいい場合';
// AかBの型が欲しいけどって言う場合は`dynamic`を使う
dynamic dynamicVariable = '限定したい場合';
// 再代入不可にするにはfinalをつける
final List<int> finalList = [1, 2, 3];
// なので、下記はエラー
// finalList = [4, 5, 6];
// 再代入はできないが中身は変えられる
finalList[0] = 10;
// compile時定数にしたい場合は`const`をつける
const List<int> consList = [1, 2, 3];
// constの変数は中身も変えられない
// 実行時エラーになる
// consList[1] = 10;

制御構文

これもほとんどよくあるものなので、知らなかったやつだけまとめる。

// nullじゃなければstrを返却。nullなら`??`より後の値が返却。
var str; // 初期値はnullなので、この場合は後半の文字列が帰る。
var hoge = str ?? 'nullだったよ';

関数

これもほとんどよくあr(ry。

名前付きパラメータ

関数を呼び出すときに仮引数名をつけて関数を呼び出せる。
何が言いたいかと言うと下記みたいにできるということ。

// 名前付きパラメータ。呼び出すときに仮引数名をつけて関数を呼び出せる
// @requiredをつけると変数が必須になる(付いてないのは省略可)
String namedParameter({@required String firstName, String lastName}) {
  return '$firstName $lastName';
}

namedParameter(firstName: 'hoge', lastName: 'huga');

Closure

関数内に関数をかける。
よく言われているClosureってやつと同じだと思う。
ちなみにラムダとかアロー関数とか言われるやつもかける。

String closure(int number) {
  // ラムダもかける
  int square(int num) => pow(num, 2);
  int half(int num) => (num / 2).round();

  return 'square: ${square(number)} / half: ${half(number)}';
}

Class

ここも知らなかったとこだけまとめる。

名前付きコンストラク

文字通り、名前付きのコンストラクタがかける。
呼び出す時はClass.namedConstructor()みたいにすればOK。

class SampleClass {
  // `_`をつけるとprivateになる
  String _name;
  int _age;

  SampleClass(String name, int age) {
    this._name = name;
    this._age = age;
  }

  // 名前付きのコンストラクタ
  SampleClass.initialized() {
    this._name = 'sample';
    this._age = 20;
  }

  String get name => this._name;
  int get age => this._age;

  void selfIntroduction() {
    print('name: $_name, age: $_age');
  }
}

// 呼び出す側
// newはいらない
final sampleClass = SampleClass();
// 名前付きコンストラクタを呼び出す
final sampleClass2 = SampleClass.intialized();

まとめ

今回はDartをインストールして簡単な構文までまとめた。
他にも色々機能はあるけどこれ以上は実際に触りながら覚えていこうと思う。
それでは今回はこの辺で。

参考サイト