データ型の後編になります。
前編はこちら
オブジェクト型はこんな感じで記載ができます。
kain.ika : イカ kani.uni : false (ika: "イカ", tako: 8, uni: false)
JavaとかC#などと違い、コンストラクタを自分で定義することはできません。コンストラクタはメンバ変数の初期化のみになります。
また、すべての変数を作成時に初期化する必要はなく、明示的に初期化されなかったメンバ変数にはデフォルト値がセットされます。
Nimにおいても他のプログラミング言語と同様にオブジェクトの継承を行うことが可能です。
kain.ika : イカ kani.uni : false kani.saba : [0, 1, 2] (saba: [0, 1, 2], ika: "イカ", tako: 8, uni: false)
ここでのポイントとなるのは、継承元となるオブジェクトは、RootObj というオブジェクトを継承するか、{.inheritable.} プラグマを指定してやる必要があるところです。
マニュアルを読む限り、inheritable プラグマを使用すると、新しい RootObj としてオブジェクトが作成されるみたいな事書いてあるのだが、実際何が違うのか良く分かりませんでした。。
{.final.} プラグマを付けることで、以降の継承ができなくなります。
タプルとは、概念的にはいくつかのデータの集まりを表したもののようです。
オブジェクト型と似ていますが、違いとして継承が出来ないことや、インデックスを用いてのアクセスが可能な事が挙げられます。
タプルは以下ように記載します。
kani.ika : IKA kani.uni : 35 kani.tai : true kani[0] : IKA kani[1] : 35 kani[2] : true
タプルは、同じ要素名・同じ型・同じ並び順の場合、同一のタプルとして扱われます。
(ika: "IKA", uni: 35, tai: true)
タプルを用いることで、参照型を使用することなく複数の値を返すプロシージャの実装が可能になります。
ika : IKAです!! uni : 3
Nimの代入操作は、通常は値渡しになります。
参照渡しを行いたい場合、ref キーワードを用いて変数を定義してやる必要があります。
12345
参照型の初期値はnul(NULL)になっているので、new でインスタンスを確保してやる必要があります。
また、参照型の値を取得するには、[ ]をつけてやります。
ただし、タプル、オブジェクトフィールドへのアクセス演算子、及び、配列、文字列などへのインデックスにアクセスする場合は、[ ]を付ける必要はありません。
kani[] : (ika: 10, uni: 20) arr[0] : 2 arr[1] : 3
参照渡しについては、ref 以外に ptr というものがあります。
両者の違いは、ref については、Nimでメモリ管理を行っているため、new で確保され得たメモリ領域は、参照が途絶えた以降のタイミングでガベージコレクションが働き自動で開放されるのに対し、ptr は、メモリの確保(alloc)・開放(dealloc)を手動で行う必要があります。
ptr は主にC言語との連携のために使用されるようです。
12345
また、ref は、値渡しの変数の参照ができないの対し、ptr は可能だという違いもあります。
12345
プロシージャ型は、プロシージャを格納するための変数になります。
KANI3
プロシージャ型は引数と戻り値が同じであれば代入可能です。
また、型類推も使用できますので、特に定義を記載に無くても問題ありません。
KANI3 KANI4
今回は以上となります。