(個人メモ) Dart基礎まとめ
Dartの文法など基本的な書き方についての個人的なまとめ
Flutterに関わる部分は書かないつもりです。
他のプログラミング言語に慣れている人がDartを入門できる程度に書くので、他の言語でも出てくる言葉などは補足説明しません
参考
実行環境
WSL
Windows 10 21H2 (19044.2486)
Ubuntu 22.04.1 LTS
環境構築
とりあえず、サンプルコードを動かせるように、Dart SDKをインストールしていく
以下のページに従ってインストールする
$ 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
エディタはVSCodeを使用し、Dart拡張機能をインストールする。
インストール後にコマンドパレットでDart: New Project
でDartのプロジェクトの雛形を作成できる。今回は動作確認程度なので、CLIで動かすようにConsole Application
を選択。
/bin
ディレクトリにエントリーポイントのコード、/lib
ディレクトリ以下に共有のコードを配置している。
コードの実行はターミナルからdart [Dartファイル]
またはVSCodeの実行でコードを実行できる。
以降はジャンルごとにコードをまとめていく。
1コードブロック全体をコピペすると、動作確認ができるように記述していく。
Dartコードブロックの直下には実行結果を記載する。
基本の構文
// bin/tour/01_basic.dart
void printInteger(int x) {
print('"The number is $x"'); // $変数で値が埋め込める
print("'The number is $x'");
print("x + 10 = ${x + 10}"); // 式も${式}で埋め込める
}
void main() {
var x = 42;
printInteger(x);
}
"The number is 42"
'The number is 42'
x + 10 = 52
-
main
関数が最初に実行される - 変数宣言は
var name = value
(他のパターンは後述) - 引数の型は前置
- 文字列リテラルはシングルクォーテーションかダブルクォーテーションで囲む
- シングルクォーテーションで囲んだ場合は、中でダブルクォーテーションを使用できる (逆もまた然り)
- 文字列リテラル中で
$変数
で変数の値を埋め込める
コメント
コメントは//
または/*...*/
を使う。
///
または/**...**/
はドキュメント用のコメントで、[]
で囲むことでクラス、メソッド、フィールド、関数などを参照できる
データ型
Dartで出てくる基本的なデータの型を説明する。
Dartでは以下の型を標準でサポートしている。
これらの型はnull
以外はすべてObject
型を上位型として持ち、メソッドを持つ。
- num (数値型)
- int (符号付64bit整数型)
- double (符号付64bit浮動小数点数型)
数値型
Dartでは数値型としてint
とdouble
がある。
int
整数用の型
整数リテラルは10進数または0x
を付けた16進数で書ける。
サイズは64bitだが、Web(JavaScript)とその他の実行環境によって表現できる範囲は異なる。
Web:
その他の環境:
int型は他の言語と同様の四則演算、ビット演算、シフト演算が標準で可能。
また、+=
などの二項演算と代入を行う演算子や、++x
, x++
などのインクリメント・デクリメントもあります。
// bin/tour/02_int.dart
void main() {
// int型の変数の宣言
var a = 300;
var b = 0xff; // 255
print("### 四則演算 ###");
print("a = $a, b = $b");
// 四則演算
var plus = a + b;
var minus = a - b;
var multiple = a * b;
var divDouble = a / b; // 結果に小数点以下を含む
var divInt = a ~/ b; // 小数点以下を切り捨て
var mod = a % b;
print("a + b = $plus");
print("a - b = $minus");
print("a * b = $multiple");
print("a / b = $divDouble");
print("a ~/ b = $divInt");
print("a % b = $mod");
// bit演算
var x = 0xff; // 11111111 = 255
var y = 0x0f; // 00001111 = 15
print("### bit演算 ###");
print("x = $x, y = $y");
var and = x & y;
var or = x | y;
var xor = x ^ y;
var not = ~y;
print("x & y = $and"); // 00001111 = 15
print("x | y = $or "); // 11111111 = 255
print("x ^ y = $xor"); // 11110000 = 240
print("~y = $not"); // ...11110000 = -16
// shift演算
var z = 16;
print("### shift演算 ###");
print("z = $z");
var doubled = z << 1;
var quartered = z >> 2;
print("z << 1 = $doubled"); // 32
print("z >> 2 = $quartered"); // 8
var mz = -16;
print("mz = $mz");
var signQuartered = mz >> 2; // 符号を考慮した右シフト
var unsignQuartered = mz >>> 2; // 符号を考慮しない右シフト
print("mz >> 2 = $signQuartered"); // 32
print("mz >>> 2 = $unsignQuartered"); // 8
// 演算代入
// a += b は a = a + bと同じ
// 他の二項演算子でも同様に使用できる
var c = 2;
print("### 演算代入 ###");
print("c = $c");
c += 3;
print("c += 3 => $c"); // 5
// インクリメント・デクリメント
var d = 3;
print("### インクリメント ###");
print("d = $d"); // 3
print("d++ = ${d++}"); // 3
print("d = $d"); // 4
print("++d = ${++d}"); // 5
print("d = $d"); // 5
print("### デクリメント ###");
print("d-- = ${d--}"); // 5
print("d = $d"); // 4
print("--d = ${--d}"); // 3
print("d = $d"); // 3
}
### 四則演算 ###
a = 300, b = 255
a + b = 555
a - b = 45
a * b = 76500
a / b = 1.1764705882352942
a ~/ b = 1
a % b = 45
### bit演算 ###
x = 255, y = 15
x & y = 15
x | y = 255
x ^ y = 240
~y = -16
### shift演算 ###
z = 16
z << 1 = 32
z >> 2 = 4
mz = -16
mz >> 2 = -4
mz >>> 2 = 4611686018427387900
### 演算代入 ###
c = 2
c += 3 => 5
### インクリメント ###
d = 3
d++ = 3
d = 4
++d = 5
d = 5
### デクリメント ###
d-- = 5
d = 4
--d = 3
d = 3
double
IEEE 754で表された64ビットの浮動小数点数型
小数リテラルは10進数の固定小数点または指数表記で書ける。
int型同様に四則演算が使える。
ゼロ除算の場合は実行時エラーではなく、JavaScriptのようにNaN
(Not a Number)やInfinity
を返す。
0.0 / 0.0
: NaN
被除数が0以外のゼロ除算: Infinity
(被除数が負の場合は-Infinity
)
// bin/tour/03_double.dart
void main() {
// double型の変数の宣言
double a = 100000000; // 初期値がintでも変数にはdoubleに変換される
var b = 1.42e3; // 1.42 * 10^3
print("### 四則演算 ###");
print("a = $a, b = $b");
// 四則演算
var plus = a + b;
var minus = a - b;
var multiple = a * b;
var divDouble = a / b; // 結果に小数点以下を含む
var divInt = a ~/ b; // 小数点以下を切り捨て
var mod = a % b;
print("a + b = $plus");
print("a - b = $minus");
print("a * b = $multiple");
print("a / b = $divDouble");
print("a ~/ b = $divInt");
print("a % b = $mod");
print("### ゼロ除算 ###");
print("0.0 / 1.0 = ${0.0 / 1.0}"); // 0.0
print("0.0 / 0.0 = ${0.0 / 0.0}"); // NaN
print("1.0 / 0.0 = ${1.0 / 0.0}"); // Infinity
print("2.0 / 0.0 = ${2.0 / 0.0}"); // Infinity
print("(-1.0) / 0.0 = ${(-1.0) / 0.0}"); // -Infinity
print("0.0 ~/ 1.0 = ${0.0 ~/ 1.0}"); // 0.0
// 以下は実行時エラーが発生する
// print("0.0 ~/ 0.0 = ${0.0 ~/ 0.0}");
// print("1.0 ~/ 0.0 = ${1.0 ~/ 0.0}");
// print("2.0 ~/ 0.0 = ${2.0 ~/ 0.0}");
// print("(-1.0) ~/ 0.0 = ${(-1.0) ~/ 0.0}");
}
### 四則演算 ###
a = 100000000.0, b = 1420.0
a + b = 100001420.0
a - b = 99998580.0
a * b = 142000000000.0
a / b = 70422.5352112676
a ~/ b = 70422
a % b = 760.0
### ゼロ除算 ###
0.0 / 1.0 = 0.0
0.0 / 0.0 = NaN
1.0 / 0.0 = Infinity
2.0 / 0.0 = Infinity
(-1.0) / 0.0 = -Infinity
0.0 ~/ 1.0 = 0
num
num
はint
とdouble
の上位型です。すなわち両方の型の値をnum
型に代入できる。
また、num
型では色々なメソッドが実装しており、すべての数値型から呼び出せる。