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