はじめに
厳密さにかけているので、下記のドキュメントさらっと読むのが一番良いです。
A Tour of the Dart Languageと、Effective Dartを読みつつ、DartPad使って試すと良いかと。
基本
GoとかJavaと同じようにmain関数から処理が開始される。
変数、定数
Dartにはvar, dynamic, final, constがある。
var
var name = 'hoge';
varはJSのvarとは異なりTSのletのイメージが一番近いと思う。型が同じであれば再代入可能。
下記は可能。
var name = 'hoge';
name = 'fuga';
しかし、下記のように型が異なる場合には当然再代入できない。
var name = 'hoge';
name = 1; // 型が異なるため再代入できない
dynamic
dynamic name = 'hoge';
dynamicはJSのletのイメージが一番近いと思う。
型が異なっていても再代入可能。型は不定(dynamic型)になる。
下記すべて可能。
dynamic name = 'hoge';
name = 1;
name = 'fuga';
明示的型の記述
推論があるためあまり使わないかもしれないが、下記のようにも書ける。当然同一の型は再代入可能。
String name = 'hoge';
name = 'fuga';
final
final name = 'hoge';
JSのconstのイメージが一番近いと思う。Javaをあまり知らないがJavaのfinalに近いのかな?
再代入不可だが、参照先が変更される可能性はある。
下記は可能。
final List<int> list = [1, 2, 3];
print(list);
list[0] = 2;
print(list);
下記はできない。
final List<int> list = [1, 2, 3];
list = [3, 3, 3]; // 再代入できない。
const
再代入不可。参照先が変わることもない。
const name = 'hoge';
下記もできない。
const List<int> list = [1, 2, 3];
list[0] = 2;
デフォルト値(default value)
未初期化変数の初期値はすべてnull。
int count;
String name;
assert(count == name);
文字列結合と変数展開
下記のように改行した文字列は+で結合した文字列と同じになる。また変数展開はシングルクォーテーション、ダブルクォーテーション内で${}
または$
を用いる。
var name = 'Tarou '
'Tanaka';
var lastName = 'Tanaka'
assert(name == 'Tarou' + lastName);
assert(name == 'Tarou ${Tanaka}');
オプションのパラメータ(optional parameters)
オプションの名前付きパラメータ(optional named parameters)
引数内で{}
で囲むことで可能
String echo({ String word }) {
print(word);
return word;
}
echo(word: 'hello');
echo();
オプションの定位置パラメータ(optional poisitional parameters)
引数内で[]
で囲むことで可能
String echo([String word]) {
print(word);
return word;
}
echo('hello');
echo();
型テスト演算子(type test operators)
as
, is
, is!
がある。asはTypecastなのでTSのasと同じように捉えればよいかと。
is
, is!
はインタフェースを実装しているか否かで真偽値を返す。
dynamic name = 'hoge';
if (name is String) {
print('string'); // stringと標準出力される
}
条件式(conditional expressions)
JSの||
に近いものとしては??
がある
String echo([String word]) {
var nonNullWord = word ?? '';
print(nonNullWord);
return nonNullWord;
}
カスケード記法(cascade notation)
class Point {
num x;
num y;
}
var point = Point();
point..x = 1
..y = 2;
上記と下記は同じ
class Point {
num x;
num y;
}
var point = Point();
point.x = 1;
point.y = 2;
条件付きメンバーアクセス(conditional member access)
Rubyのぼっち演算子みたいなやつ。
下記の場合、pointがnullの場合にはnullを返し、pointがnullでない場合には、メンバーにアクセスする。
point?.x
例外処理
onを用いることで例外の種類ごとに対応可能
main() {
try {
hello();
} on Exception catch (e) {
print(e);
}
}
void hello() {
throw 'hogehoge';
}
コンストラクタ
省略記法
TSのparameter propertiesみたいなやつ
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);
}
名前付きコンストラクタ(named constructors)
class Point {
num x, y;
Point(this.x, this.y);
Point.origin() {
x = 0;
y = 0;
}
}
main() {
var point = Point.origin();
}
他にも下記の部分が気になった
- Constant constructors(immutableにできるってこと)
- Factory constructors(そういうのがあるってこと)
- getter setter(書き方)
- Implicit interface(暗黙のインタフェース)
- metadata(@requiredとか書けること)
- mixin(withで書けること)
上記すべて押さえておけばとりあえず問題なく書けると思います。