本ページはDartについて学習した内容を記録したものです。

nullable and non-nullable

タイトルからnullになり得るもの、nullになり得ないもの、何を言っているのか。

1
2
3
4
5
void main() {
  var name = 'papanoyang';
  print(name);
  name = null;
}

Example

文字列で宣言した変数にnullを設定しようとするとエラーになった。エラー内容はnullを設定できないものにnullを設定しているから怒られている。

すなわち、通常のように宣言したものはnon-nullableとなる。

nullを設定できるようにするにはどうすれば良いか。はてなをつければこの変数はnullが入るかもとnullable変数を宣言することができる。

1
2
3
4
5
6
void main() {
  String? name = 'papanoyang';
  print(name);
  name = null;
  print(name);
}

上のようにvarでははてなは使えないので型を指定するときに使える。

はてなと反対のものもある。びっくりマークだ。これは絶対にnullではないと宣言するものだ。まだ該当例は出ないけど、今後、使うどきがくるので割愛する。

const and final

constもfinalも、一旦宣言すると値の変更ができないものである。

Example

変更しようとしたら、上のように怒られる。

同じようなものなのになんで2種類あるのか、違いがなんなのか?

それを確認するためにまず以下のコードを実行してみよう。

1
2
3
4
void main() {
  DateTime now = DateTime.now();
  print(now);
}
1
2024-01-21 17:09:17.157

実行すると現在時刻が出力される。DateTimeというものは日付、時間に関するクラスで現在時間を取得することができる。

この現在時刻というものはいつの時刻になるのか。Dartで作成されたコードの実行は、パソコンが理解でいる言語に変換されて変換されたものがパソコンによって実行されることになる。

なので上記では実行されるときに現在時刻が分かるようになる。以下のコードはどうだろう。

1
2
3
4
void main() {
  final DateTime now = DateTime.now();
  print(now);
}

問題なく、実行される。続いて以下のように追加してみると怒られる。

Example

上記のようにfinalの場合は実行時に値が分かれば良いが、constの場合はコンパイル時に値が確定されなければいけない。

Operator

演算は前回実施してみたが、もう1度みてみよう。

1
2
3
4
5
6
7
8
9
10
void main() {
  int number = 10;
  print('numberの値は$numberです。');
  print('$number + 2 = ${number + 2}');
  print('$number - 2 = ${number - 2}');
  print('$number / 2 = ${number / 2}');
  print('$number * 2 = ${number * 2}');
  print('$number % 2 = ${number % 2}');
  print('numberの値は$numberです。');
}
1
2
3
4
5
6
7
numberの値は10です。
10 + 2 = 12
10 - 2 = 8
10 / 2 = 5
10 * 2 = 20
10 % 2 = 0
numberの値は10です。

前回より1つ増えたが%は余りを得られるものである。上のように演算は実施しても変数の値は変更されてない。次をみてみよう。

1
2
3
4
5
6
void main() {
  int number = 10;
  print('numberの値は$numberです。');
  print('$number++ => ${number++}');
  print('numberの値は$numberです。');
}
1
2
3
numberの値は10です。
10++ => 10
numberの値は11です。

++演算子は変数の値を1個増やす演算子である。前につけることもできる。

1
2
3
4
5
6
7
8
void main() {
  int number = 10;
  print('numberの値は$numberです。');
  print('$number++ => ${number++}');
  print('numberの値は$numberです。');
  print('++$number => ${++number}');
  print('numberの値は$numberです。');
}
1
2
3
4
5
numberの値は10です。
10++ => 10
numberの値は11です。
++11 => 12
numberの値は12です。

++を前につけた時と後ろにつけた時の差が見える。後ろにつけたときは実行されるときに値を使ってから実行後に演算が行われる。なので10が表示されてから次の行で値が増えたのが見える。前につけた時は先に値が増える。–も同様である。

1
2
3
4
5
6
7
8
void main() {
  int number = 10;
  print('numberの値は$numberです。');
  print('$number-- => ${number--}');
  print('numberの値は$numberです。');
  print('--$number => ${--number}');
  print('numberの値は$numberです。');
}
1
2
3
4
5
numberの値は10です。
10-- => 10
numberの値は9です。
--9 => 8
numberの値は8です。

上のように変数の値を変える演算子は他にもある。+=のように=をつけることで変数の値を変更することができる。

v += 1

上の内容は次の内容と同じである。

v = v + 1

コードをみてみよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main() {
  double number = 10;
  print('numberの値は$numberです。');
  number += 5;
  print('numberの値は$numberです。');
  number -= 5;
  print('numberの値は$numberです。');
  number *= 2;
  print('numberの値は$numberです。');
  number /= 2;
  print('numberの値は$numberです。');
  number %= 3;
  print('numberの値は$numberです。');
}
1
2
3
4
5
6
numberの値は10です。
numberの値は15です。
numberの値は10です。
numberの値は20です。
numberの値は10です。
numberの値は1です。

割り算は小数点の結果が出る可能性があるので今回はdouble型に変更している。

このページの最初にnullに関することを書いているが、演算子にもnullに関するものがある。

1
2
3
4
5
6
7
8
9
void main() {
  double number = 10.0;
  double? number2 = null;
  
  number ??= 5.0;
  print('numberの値は$numberです。');
  number2 ??= number;
  print('number2の値は$number2です。');
}
1
2
numberの値は10です。
number2の値は10です。

「??=」の意味は変数がnullの場合、右の値で設定するとのことだ。

比較演算

他の言語と同じように条件文に使える比較演算子も存在する。比較演算子の結果はboolである。

1
2
3
4
5
6
7
8
9
10
void main() {
  int number1 = 1;
  int number2 = 2;
  print(number1 > number2);
  print(number1 < number2);
  print(number1 >= number2);
  print(number1 <= number2);
  print(number1 == number2);
  print(number1 != number2);
}
1
2
3
4
5
6
false
true
false
true
false
true

タイプを比較するものもある。タイプを比較するのはdynamicで宣言された変数によく使えそうだ。

1
2
3
4
5
6
7
8
void main() {
  var number;
  print(number is int);
  number = 1;
  print(number is int);
  print(number is String);
  print(number is! int);
}
1
2
3
4
false
true
false
false

結果をみると最初はデータタイプが決まってなく、intではないためfalseの結果が出た。その次に1を設定したのでtrueの結果、次はStringかを確認するとintであり、Stringではないのでfalse、その次にびっくりマークをつけるとnotの意味でintではないものとのことだ。intなので結果はfalseである。

論理演算子

比較演算をつなげて使えるのが論理演算子でコードで確認してみよう。

1
2
3
4
5
6
7
void main() {
  bool result1 = 10 < 12;
  bool result2 = 1 > 2;
  print(result1 && result2);
  print(result1 || result2);
  print(result1 && !result2);
}
1
2
3
false
true
true

result1は結果が真なのでtrue、result2は結果が偽なのでfalseである。

&&はAND条件なので情報が真の場合のみtrueになるので1個目はresult2がfalseのため、falseである。

||はOR条件なのでどちらかがtrueであれば結果はtrueである。なので2個目は結果がtrueである。

3個目はAND条件なのにtrueである理由はresult2の前にビックリマークをつけている。びっくりマークはnotの意味なので結果はtrueになる。

タグ:

カテゴリー:

更新日時:

コメントする