-
Notifications
You must be signed in to change notification settings - Fork 0
dart_basic_for_programmer
「CとかJavaとかは少し書けるよ」という人向けです。
プログラミング全くやったことない人は別ページで勉強してください。
オブジェクト指向が絡む部分はこのページでは扱いません。
- 動かせる環境を作る
- とりあえずHello world
- コメント
- 変数
- 数値計算とか
- 配列
- if, switch
- for, while
- 関数、スコープ
- null許容型
まずDartで書いたコードを実行できるようになりましょう。
候補として挙げられるのは以下のいずれかです。
- DartPad(ウェブでDartを動かせるサービス)
- 自分のパソコンにインストールする
おすすめはdartpadです。とにかく楽です。以下のリンクからアクセスできます。
https://dartpad.dev/
Flutterをインストールしている人は、Dartを自分のパソコン上で実行できます。
若干こっちのが早いのでストレスにはなりづらいかもしれません。
hoge.dart
というファイルに記述されたdartプログラムを実行する場合は、以下のコマンドを使いましょう。
$ dart run hoge.dart
一旦Hello world出力してみましょう。
まずは以下のコードをdartPadかローカルで書いてみて下さい。
void main() {
print('Hello world');
}
写し終わったら、実行してみましょう。写し間違えがなければ Hello world
が出力されると思います。
ここで重要なのは以下の3つです。覚えといてください
- Dartでは、
main()
関数から処理が始まる。 - 各文の終わりには
;
が必要。 -
print('なんか文字列')
を使うとコンソールになんか文字列
が出力される。
コメントの書き方を説明しておきます。
といっても記法はCと同じです。
-
//
を書くと、その行の//
以降はコンパイラに無視される。1行だけ。 -
/*
と*/
で囲まれた部分はコンパイラに無視される。複数行に渡って使える。
以下のようなプログラムがあったとします。
void main() {
print('hello');
// print('world');
/*
print('hoge');
print('fuga');
*/
}
ここで、最初のprint()
関数は呼び出されますが、その下の3つのprint()
関数はコメントになっているので実行されません。
出力されるのはhello
だけとなります。
変数について解説します。
DartはCやJavaと同じで静的型付け言語です。つまり、変数には型が存在するということです。
また、当たり前ですが「int型として宣言した変数にdouble型の値を代入」みたいな操作は禁止されています。
宣言の仕方、使い方は以下の感じです。ほぼJavaとかと同じ。
void main() {
// 「型 変数名」 で宣言できる。
String mojiretsu;
// 「変数名 = '値'」とすると代入できる
mojiretsu = 'aaaaa';
// 「型 変数名 = 初期値」とすると、宣言と同時に初期化できる。
String mojiretsu2 = 'hello';
// 文字列型なのでprint()関数に渡せる。
print(mojiretsu); // aaaaa が出力される。
print(mojiretsu2); // hello が出力される。
}
基本的な部分はコメントに書いてあるとおりです。ちなみに宣言と同時に初期化する場合、型を省略できます。実際の書き方は以下のとおりです。
void main() {
// 通常の宣言
String hoge = 'hoge';
// 型名を省略した宣言
var fuga = 'fuga';
}
再代入の禁止、定数はそれぞれfinal
、const
というキーワードを使います。var同様に、宣言と同時に初期化する場合は型名を省略できます。
const、finalの違いは内城には正直良くわかりません。constのが強いみたいです。
void main() {
// 再代入の禁止
final String hoge = 'aaa';
// 型名を省略
final fuga = 'bbb';
// hoge, fugaには再代入できないのでこれらはエラーになる。
hoge = 'AAA';
fuga = 'BBB';
}
基本的な型は以下のとおりです。
-
int
... 整数のやつ -
double
... 少数含むやつ -
String
... 文字列 -
bool
... trueかfalse -
null
... なにもないことを示す -
dynamic
... どんな型の値でも入れられるけど基本使っちゃダメ
あとは、変数名の前に_
をつけると、他のファイルから参照できなくなります。Javaでいうところのprivate
とかみたいな(厳密には違った気がするけど)。
例えば_hoge
とすると、他のファイルから見えなくなる。
これも他の言語とほぼ同じです。
int
同士かdouble
同士なら四則演算可能、文字列で足し算をすると2つの文字列を繋げたものが得られるといった感じです。
hoge += 1;
とかすると、hoge = hoge + 1
と同じになるみたいなのも同じ。
型が違う場合はキャストしましょう。このあたりはその都度調べると良いと思う。
また、文字列へのキャストについてのみ、どの変数にも.toString()
というやつが使え、これを使うとその変数を文字列で表したものが得られます。
たとえば、int hoge = 6
として宣言したhoge
に対してvar fuga = hoge.toString()
とすると、fuga
には6
の文字列表現である'6'
が代入されます。
また、文字列内で変数の値を使いたいときは、${}を使うことができます。具体例を見るとわかりやすいです。
void main() {
int aaa = 100;
print('aaa is ${aaa}'); // 「aaa is 100」 と出力される。
// aaa に値を再代入して同じprint関数を使ってみる。
aaa = 200;
print('aaa is ${aaa}'); // 「aaa is 200」 と出力される。
}
配列について説明します。
Dartの配列はListと呼びます。Dartの配列はCと違って長さを予め宣言する必要がないため非常に使いやすいです。
なお、配列に入れることのできる型は基本一種類だけなので注意しましょう。
具体的な使い方は以下の感じになります。
void main() {
// int型を格納できるListを宣言する
List<int> aaaaa = [1,2,3];
// String型を格納できるListを宣言する
List<String> bbbbbb = ['aaaaaa', 'asdlfkjas', 'hello', 'world'];
// bbbbbbに格納されている値にアクセスする。添字は0始まり。
print(bbbbbb[0]); // aaaaaa が出力される。
print(bbbbbb[1]); // asdlfkjas が出力される。
print(aaaaa.toString()); // [1, 2, 3] と出力される。
// aaaaaに新たに値を追加する。
aaaaa.add('100');
print(aaaaa.toString()); // [1, 2, 3, 100] と出力される。
}
他の言語同様、dartにもif, switchを用いた条件分岐があります。これに関しても使い方はほとんどJavaなどの通常の言語と同じです。
void main() {
// ()の中に条件を書く。trueだった場合、if節が、falseだった場合にはelse節が実行される。
if (true) {
print('condition was true'); // 実行される
} else {
print('condition was false'); // 実行されない
}
// 条件はbool型だったら何でもいい。else節は省略できる。
final exampleNumber = 1;
if (exampleNumber == 1) {
print('exampleNumber equals 1');
}
// else-ifを使うと複数の条件を書くことができる。以下の例ではaaaaaaaaaが出力される。
// else-ifでもelse節は省略できる。
final otherNumber = 42;
if (otherNumber < 10) {
print('hoge');
} else if (otherNumber == 42) {
print('aaaaaaaaa');
} else {
print('fuga');
}
}
これもほぼJavaやCと同じです。switch (hoge) { ... }
の、hogeでパターンマッチしていくイメージです。
注意点として、breakを各分岐の最後に実行しない場合、その次のケースにも進んでしまいます。
また、どのケースにも引っかからなかった場合、default節が実行されます。これは省略可能ですが、バグをなくすためにも入れたほうが安心できます。
void main() {
// variableの値が'red'なので、一番最初のcaseが実行される。
final variable = 'red';
switch(variable) {
case 'red':
print('hoge');
break;
case 'blue':
print('fuga');
break;
case 'green':
print('piyo');
break;
default:
print('aaaaaaaaaaa');
}
}
これについてもJavaやCとほとんど同じです。
break
を使うとループ自体を終わり、continue
を使うとその繰り返し処理を強制終了して次の繰り返しに進みます。
また、for文に関しては配列と合わせ、
void main() {
// 0, 2, 3,,, という感じで9まで出力される。
for (int 1 = 0; i < 10; i++) {
print(i.toString()); // print関数はString型しか出力できない。toString()を使うとint型を文字列型に変換できる。
}
// while(条件式)の、条件式部分がtrueの間ずっとループする。以下は無限ループになり、hogeを出力し続ける。
while(true) {
print('hoge');
}
}