Objects
Dartのすべてがオブジェクトです! nullを含むすべてのオブジェクトは、あるクラスのインスタンスであり、これらのクラスのすべてはオブジェクトクラスから継承します。これを確認するために、isの演算子とis!の演算子を使用して、オブジェクトがインスタンスであるかクラスのタイプであるか確認出来ます。以下の例を見てみましょう。
void main() {
print('"Shashank" is an instance of "String" class: ${"Shashank" is String}');
print('7799 is an instance of "int" class: ${7799 is int}');
print('79.97 is an instance of "double" class: ${77.99 is double}');
print('true is an instance of "bool" class: ${true is bool}');
print('null is an instance of "null" class: ${null is Null}');
print('"Anything even strings" are an instance of "Object" class: ${"Anything even strings" is Object}');
print('null is an instance of "Object" class: ${null is Object}');
}
上記のコードの結果は以下の通りです。
"Shashank" is an instance of "String" class: true
7799 is an instance of "int" class: true
79.97 is an instance of "double" class: true
true is an instance of "bool" class: true
null is an instance of "null" class: true
"Anything even strings" are an instance of "Object" class: true
null is an instance of "Object" class: true
したがって、DartでのすべてがObjectであり、classの名前が識別子データ型 (Data Type Identifier)であることがはっきりとわかります。上記の例での$の演算子はdynamicデータを文字列に入れるために使用されています。マルチレベル値の場合、$ {person.name}または$ {77.99はdouble}のように{}とともに$を使用します。Single valueまたは変数を使用する場合は、「私の名前は$name」のように、{}なしでプレーンな$を使用できます。ここで、nameは変数です。
Classes(クラス)
他のオブジェクト指向プログラミング言語と同様に、classはDartのコア機能です。Classはオブジェクトの仕様を定義できます。クラスには、UpperCamelCase命名規則に従って名前を付ける必要があります。Classの内で、Objectがどのように表示されるかを定義します。
データ間のより複雑な関係を表現したい場合、または特定の機能を単一のビルディングブロック (one building block)にカプセル化したい場合は、通常、独自のクラスを作成します。
class Product {
var name = 'MacBook Pro';
var price = 1299.99;
}
void main() {
var product1 = Product();
var product2 = Product();
product2.name = 'iPad Pro';
product2.price = 999.99;
print(product1);
print(product1.name);
print(product1.price);
print(product2);
print(product2.name);
print(product2.price);
}
上記のコードの結果は以下の通りです。
Instance of 'Product'
MacBook Pro
1299.99
Instance of 'Product'
iPad Pro
999.99
2つのinstance変数(class-level)を持つProductという名前のclassがあります。instance変数という意味はいくつかの値で初期化するclass内の変数です。 ここでは、dart type-inferenceのため、varを使用して変数を定義しています。Dartは、var型の変数に割り当てられた値型を自動参照することについて便利です。
次に、main(){...}関数でProduct というclassを使用する2つの新しいObjectsを作成します。objectName.instanceVariableNameのようにドット「.」を使用してclass / instance変数にアクセスできます。例えば、product1.nameです。これらの変数に新しい値を割り当てることもできます。
Dartでprivate変数を宣言するには、_descriptionのようにinstance変数名の前に_を使用します。これにより、変数がprivateになり、class外でアクセスできなくなります。そして、Lists、Maps、const、finalを見てみましょう。
Final とconst
Dartであるconstおよびfinalのようなキーワードは、固定値変数を作成するために使用されます。それでは、違い点は何でしょうか?
Constはコンパイル時定数(compile-time constant)を提供します。つまり、constはプログラミングのコンパイル中で、constの値を宣言する必要があります。それに対して、finalは実行時定数(runtime constant)であり、プログラムの実行中にその値を割り当てることができることを意味します。
よく理解するために、以下の例を見てみましょう。
int calculateSquare(int value){
return value * value;
}
void main() {
const double PI = 3.1415;
final int square_7 = calculateSquare(7);
print(PI);
print(square_7);
}
上記の例のように、PIの値はコンパイル時に認識されます。しかし、square_7の値はコンパイル時に認識されいなく、実行時に計算されます。これは、final(実行時定数)とconst(コンパイル時定数)の主な違い点です。
Dartのリスト
他のプログラミング言語のArraysと同様に、Dartは、固定数の類似またはdynamicのデータ型の変数のいずれかを保持できるArraysのようなデータ構造を構築するためにリストというclassを提供します。Dartには、リストの作成するための[]の構文もあります。
固定的なリスト
固定長であるリストは、その長さを指定することで宣言できます。例えば:
List<dynamic> aFixedList = new List(9);
List<String> anotherFixedList = new List(7);
List <dynamic>は、9文字の長さのリストを作成します。リストはジェネリック型であるため、リスト内の要素のデータ型は<>内のキーワードによって確定されます。最初の件では、リストの長さは9で、要素のデータ型はdynamicです。そして、2番目の件では、リストの長さは7で、要素のデータ型はstringです。
動的なリスト(Growable lists)
動的リスト (Growable lists)という意味はList()の初期化方法で引数又は値なしで定義されたリストです。以下の例を見てみましょう。
List<String> aGrowableList = new List();
aGrowableList.add("Shashank");
aGrowableList.add("Biplav");
//changing a value at an existing index in a list
aGrowableList[0]= 'Love';
aGrowableList[1]= 'Dart';
Maps
Python辞書またはJavaScriptのリテラルのobjectに精通している場合、Dartのmapsも同様です。基本的に、mapsはkey-valueのペアのコレクションです。 Dartには、mapの作成に使用されるMap classがあります。Mapには、どんなタイプのkeyとvalueを含めることができます。
次の例を見てみましょう。
var trainCompartments = new Map<int, String>();
//assign values to the keys
trainCompartments[1] = 'ENGINE';
trainCompartments[2] = 'WOMEN CHAIR CAR';
trainCompartments[3] = 'WOMEN SLEEPER CAR';
trainCompartments[4] = 'MEN CHAIR CAR';
trainCompartments[5] = 'MEN SLEEPER CAR';
print("trainCompartments=> $trainCompartments");
ここで、1、2、3、4、5はインデックスではなくkeysです。Printステートメントは、次の結果を出します。
trainCompartments=> {1: ENGINE, 2: WOMEN CHAIR CAR, 3: WOMEN SLEEPER CAR, 4: MEN CHAIR CAR, 5: MEN SLEEPER CAR}
Mapの上の.entriesプロパティからアクセスすることで、mapのアイテムを反復処理できます。
上記はDartに関する知識です。Dartがどのように機能するかをより明確にご理解いただくことを願っています。シリーズの次回の記事でお会いしましょう。