Contents
変数
Dartでの変数宣言と初期化方法。
var name = 'Bob';
型注釈をせずに変数宣言する場合上記のようにvarキーワードを使います。変数は参照を格納します。上記サンプルでは変数nameは”Bob”という文字列値を持つString型のオブジェクトへの参照を保持します。
変数nameに型注釈(アノテーション)はありませんが、変数nameはString型と型推定されます。変数の型を単一の型に制限したくない場合は、Object型、またはdynamic型を指定します。
dynamic name = 'Bob';
変数の型を明示的に宣言(型注釈)する場合は↓
String name = 'Bob';
型名 変数名=リテラル;
です。
変数を宣言して初期化しないと自動的にnullがセットされます。
String c; print(c==null); //true<br> int d;<br> print(d==null); //true<br>
定数
値を変更することがない場合(つまり定数)は、varキーワードではなくfinalキーワードまたはconstキーワードを使用します。finalキーワードで宣言した定数は一度だけ値をセットできます。
constキーワードを用いて宣言した定数はコンパイル時定数です。((Const variables)const定数は暗黙的にfinalです。)
Note:インスタンス変数はfinalで宣言します。constでは宣言しません。finalで宣言されたインスタンス変数は、コンストラクタのボディが始まる前に初期化する必要があります。具体的には
–インスタンス変数の宣言時、
–コンストラクタの引数での初期化
–コンストラクタのイニシャライザリストでの初期化
のいずれかで初期化する必要があります。
finalキーワードを用いた定数の宣言と初期化のサンプルです。
final name = 'Bob'; // 型注釈無し final String nickname = 'Bobby';
定数の値を変更(再セット)することはできません。
final name="bob"; print(name); name="cake"; //定数nameの値を変えようとしているのでエラー print(name);
コンパイル時定数にしたい変数にはconstキーワードを付けます。const定数(const variable)がクラスレベルの場合、
static const
を付けます。
クラスレベルとは普通に考えてstatic変数(static field)のことか?
constを付けて宣言した定数(const variable)には、
- 数値リテラルや文字列リテラル
- const定数(const variable)
- 数学的な計算結果である定数値
などをセットできます。
const bar = 1000000; // Unit of pressure (dynes/cm2) const double atm = 1.01325 * bar; // Standard atmosphere
constキーワードはconst定数(const variables)を宣言する時以外にも使用します。
定数値(constant values)を生成する時にも使用できます。同様に定数値(constant values)を生成するコンストラクタの宣言にも使用できます。あらゆる変数に定数値(constant value)を代入できます。
var foo = const []; //(1) final bar = const []; //(2) const baz = []; // Equivalent to `const []`(3) foo = [1,2,3]; //←問題ない。(4) baz = [42]; //←エラー。(5) //↑Constant variables can't be assigned a value //「const定数に値を代入することはできません。」
(1)変数fooに定数値である空のリストを代入。後にfooに別のリストを再代入することはできる。
(2)final変数barに定数値である空のリストを代入。final変数なのでこの後、別のリストをbarに再代入することはできない。
(3)const定数bazに空のリストを代入。空のリストにはconstは付いていないが、const定数はコンパイル時定数(コンパイル時(実行前)に値が決定できないといけない)なので、必然的に右辺もコンパイル時に値が決まるものでないといけない。
上記サンプル(3)のbazのように、const定数の宣言時に初期化する式(上記サンプルでは空のリスト)につけるconstは省略できます。
「finalでもconstでもない変数」は値を変更(再代入)することができます。
上記サンプル(1)の変数fooのように、それまで定数値(constant value)が代入されていた場合でも、値を変更(再代入)することができます。(4)
const定数(const variable)の値を変更すること(const定数への再代入)はできません。
Dart2.5から、タイプチェック演算子(is,as)やcollection if,スプレッド演算子( … と …?)を用いた定数値の定義が可能になりました。
// Valid compile-time constants as of Dart 2.5. const Object i = 3; // Where i is a const Object with an int value... const list = [i as int]; // Use a typecast. const map = {if (i is int) i: "int"}; // Use is and collection if. const set = {if (list is List<int>) ...list}; // ...and a spread.
Note:finalオブジェクトの値は変更(再代入)できませんが、finalオブジェクトのフィールド(プロパティ)は変更できます。それに対して、constオブジェクトとそのフィールド(プロパティ)は変更できません。
constオブジェクトとそのフィールド(プロパティ)はimmutableです。
constキーワードを使用しての定数値(constant values)を生成に関するさらなる情報は、リスト、マップ、クラスなどをご覧ください。
組み込み型
Dart言語は以下の型について特別なサポートをしています。
- 数値(numbers)
- 文字列(strings)
- 真偽値(booleans)
- 配列(lists)
- セット(sets)
- マップ(maps)
- runes
- シンボル(symbols)
上記の型はリテラルを用いて初期化することができます。例えば’this is a string’は文字列リテラル、trueは真偽値リテラルです。
Dartの全ての変数はオブジェクト(クラスのインスタンス)を参照しています。通常は変数を初期化するのにコンストラクタを使用します。いくつかの組み込み型はその型自身のコンストラクタを持っています。例えばMap()コンストラクタでマップを生成します。
参考
https://dart.dev/guides/language/language-tour#comments
https://dart.dev/guides/language/language-tour#final-and-const