さっき決めたブログ

[Nim]Nimの文法を勉強 05 (データ型(後編))

データ型の後編になります。
前編はこちら

オブジェクト型

オブジェクト型はこんな感じで記載ができます。

実行結果
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

参考にしたサイトなど

Nim Tutorial (Part I)
https://nim-lang.org/docs/tut1.html
Nim Tutorial Part Iを日本語訳してみた(後編)
https://qiita.com/KTakahiro1729/items/3f18811267bf4f8075d5
【Nim】個人的逆引きリファレンス
http://flat-leon.hatenablog.com/entry/nim_howto
DeepL翻訳
https://www.deepl.com/ja/translator

今回は以上となります。

投稿者プロフィール

KARASU
うーん いろいろ考え中。。。

コメント

コメント取得中...

関連記事

TOPへ