プログラミング言語Dartで知っておきたいことのまとめ
この記事では、Dartで知っておきたいことをまとめていく。
Dart の環境構築
以下のページを参考に構築すること。筆者の環境はUbuntu。
手順を以下にまとめる。
sudo apt-get update && sudo apt-get install apt-transport-https
wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub \
| sudo gpg --dearmor -o /usr/share/keyrings/dart.gpg
echo 'deb [signed-by=/usr/share/keyrings/dart.gpg arch=amd64] https://storage.googleapis.com/download.dartlang.org/linux/debian stable main' \
| sudo tee /etc/apt/sources.list.d/dart_stable.list
sudo apt-get update && sudo apt-get install dart
Hello world
まずはHello Worldをしよう。
// main.dart
void main() {
print("hello world");
}
そして、以下のコマンドを実行する。
dart main.dart
すると実行される。
Dart自体はインタプリタ的にずぐに実行することもできれば、コンパイルしてから実行することもできる。
また、JavaScriptに変換することもできる!(なんだその機能は……)
変数定義
Dartの変数定義には、var
の型推論が使える。
Kotlinのようにval
とかはない。
void main() {
var sample = 14;
print("This is ${sample}");
}
// This is 14 と表示される。
var
ではなく、型を定義して使うこともできる。
代表的なものを以下のコードで書いていく。
void main() {
// 文字列
String message = 'こんにちは';
// 整数
int count = 42;
// 小数
double temperature = 36.5;
// 真偽値
bool isCompleted = false;
// リスト
List<String> fruits = ['りんご', 'バナナ', 'オレンジ'];
// マップ(辞書)
Map<String, int> scores = {
'Alice': 95,
'Bob': 87,
'Carol': 92
};
}
定数 finalとconst
定数としては、final
とconst
が使える。
void main() {
final String name = 'Alice';
const double pi = 3.14159;
}
これらの定数は値が変更ができないことは同じだが、値が評価されるタイミングが異なる。
final
実行時に値が代入された時const
コンパイル時に決定する
多くの使い方はクラス内の定数などでfinal
を使うことが多いだろう。
制御構文について
Dartの制御構文は以下の通り。1
if else
Dartはelse if
派閥らしい。
void main() {
int score = 85;
if (score >= 90) {
print('優秀!');
} else if (score >= 70) {
print('良好');
} else if (score >= 60) {
print('合格');
} else {
print('再試験');
}
}
Switch case
break
が必要
void main() {
String grade = 'B';
switch (grade) {
case 'A':
print('素晴らしい!');
break;
case 'B':
print('良いですね');
break;
default:
print('評価不明');
}
}
また、swtich文は以下のようにも書ける。
var grade = "A";
String message = switch (grade) {
'A' => '素晴らしい!',
'B' => '良いですね',
'C' => '普通です',
_ => '評価不明' // defaultの代わりに_を使用
};
for in
各要素はvar
で型推論ができる。
void main() {
List<String> colors = ['赤', '青', '緑'];
for (var color in colors) {
print('色: $color');
}
}
また、Mapの場合だとforEach
メソッドが使えて便利。
Map<String, int> scores = {
'田中': 95,
'山田': 87,
'佐藤': 16
};
// キーと値を同時に処理
scores.forEach((name, score) {
print('${name}: ${score}');
});
continue break
ループ処理の時、continue
とbreak
が使える。
また、ラベル付きの処理もできる。
outer: for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (j == 1) {
continue outer; // 外側ループの次の繰り返しへ
}
print('i=$i, j=$j');
}
}
関数について
関数についてはTypeScriptっぽいかな。
int add(int a, int b) {
return a + b;
}
void main(){
var result = add(4, 6);
print("結果は... ${result}");
}
シンプルなものなら、アロー関数で一行で書ける。これもJavaScriptっぽい。
int add(int a, int b) => a + b;
引数をオプションにできる。オプションのやり方は2種類ある。
[ ]
位置でオプションを指定する。{ }
名前でオプションを指定する。
// 名前付きオプション引数
void greet(String name, {String? greeting, int? times}) {
// 省略...
}
greet("田中", greeting: "こんにちは!", times: 3);
// 位置オプション引数
void greet(String name, [String? greeting, int? times]) {
// 省略...
}
greet('Hanako', 'Hi', 3);
デフォルト値を入れることも可能。
void createUser(String name, [int age = 0, String role = 'guest'])
クラスについて
基本的なクラスの使い方は以下の通り。
class Person {
// プロパティ(属性)
String name;
int age;
// コンストラクタ(オブジェクトを作るときの設定)
Person(this.name, this.age);
// メソッド(動作・機能)
void introduce() {
print('私の名前は$nameで、${age}歳です。');
}
}
void main() {
// クラスからオブジェクトを作成
Person person1 = Person('田中', 25);
// メソッドを呼び出し
person1.introduce(); // 出力:私の名前は田中で、25歳です。
}
クラスの基本的な仕組みについて
this
は省略できる。this.name
でもname
でもOK.public
,private
などはない。- デフォルトでpublicメソッド。頭文字に
_
がついた場合はprivateになる。 - 同じファイルなら、privateプロパティにもアクセスできる!
get
set
がある。
プロパティについて
プロパティは以下のように指定する。
class Person {
String name;
String country = '日本'; // デフォルト値を設定
Person(this.name);
}
また、final
修飾を使うことで、一度プロパティを設定すると、そのプロパティは変更できないようにできる。
class Person {
final String name;
Person(this.name);
}
コンストラクタについて
コンストラクタの基本的な書き方は以下の通り。 他の言語でもよくある書き方ではある。
class Person {
String name;
int age;
// 基本的なコンストラクタ
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
void main() {
Person person = Person('田中', 25);
}
簡潔な書き方として配下の書き方がある。 Dartではこちらの方が見かける。
class Person {
String name;
int age;
// より簡潔な書き方
Person(this.name, this.age);
}