Closed5

(個人メモ) Dart基礎まとめ

kourinkourin

Dartの文法など基本的な書き方についての個人的なまとめ
Flutterに関わる部分は書かないつもりです。
他のプログラミング言語に慣れている人がDartを入門できる程度に書くので、他の言語でも出てくる言葉などは補足説明しません

参考

https://dart.dev/guides

実行環境

WSL
Windows 10 21H2 (19044.2486)
Ubuntu 22.04.1 LTS

kourinkourin

環境構築

とりあえず、サンプルコードを動かせるように、Dart SDKをインストールしていく
以下のページに従ってインストールする
https://dart.dev/get-dart#install-using-apt-get

$ 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の実行でコードを実行できる。

kourinkourin

以降はジャンルごとにコードをまとめていく。
1コードブロック全体をコピペすると、動作確認ができるように記述していく。
Dartコードブロックの直下には実行結果を記載する。

kourinkourin

基本の構文

// 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 (他のパターンは後述)
  • 引数の型は前置
  • 文字列リテラルはシングルクォーテーションかダブルクォーテーションで囲む
    • シングルクォーテーションで囲んだ場合は、中でダブルクォーテーションを使用できる (逆もまた然り)
  • 文字列リテラル中で$変数で変数の値を埋め込める

コメント

コメントは//または/*...*/を使う。
///または/**...**/はドキュメント用のコメントで、[]で囲むことでクラス、メソッド、フィールド、関数などを参照できる

kourinkourin

データ型

Dartで出てくる基本的なデータの型を説明する。
Dartでは以下の型を標準でサポートしている。
これらの型はnull以外はすべてObject型を上位型として持ち、メソッドを持つ。

  • num (数値型)
    • int (符号付64bit整数型)
    • double (符号付64bit浮動小数点数型)

数値型

Dartでは数値型としてintdoubleがある。

int

整数用の型
整数リテラルは10進数または0xを付けた16進数で書ける。
サイズは64bitだが、Web(JavaScript)とその他の実行環境によって表現できる範囲は異なる。

Web: -2^{53} から 2^{53} - 1
その他の環境: -2^{63} から 2^{63} - 1

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

numintdoubleの上位型です。すなわち両方の型の値をnum型に代入できる。
また、num型では色々なメソッドが実装しており、すべての数値型から呼び出せる。

このスクラップは2023/11/30にクローズされました