====== クラス・オブジェクトについて ====== ==== 資料 ==== https://miniscript.org/files/MiniScript-QuickRef.pdf __isaについて https://miniscript.org/wiki/Isa ==== 概要 ==== クラスまたはオブジェクトは、Miniscriptにおいては親を指す特別な __isa エントリを持つマップです。 また、ドット構文で呼び出された関数は、呼び出されたオブジェクトを参照する自己変数を取得します。 ---- ==== 説明 ==== 正直クラスの概念は理解が難しいので、特に使う予定が少なければ最初は読み飛ばしても大丈夫です。 が、情報がないと困る(特に自分)ので、書いておきます。 Miniscriptにおけるクラスは、ここでは「特殊なマップ変数」という扱いになります。 通常のmapと違って特殊なのは、以下の内容です。 * 各種変数・関数の呼び出し方が「class.変数」「class.関数」となっていること * 「__isa」というエントリーが存在していること __isaは、マップの基本クラスを参照する特別なエントリーという位置づけになっております。 クラスから作成したインスタンスでは、この基本クラスの情報を参照して関数を呼び出したり、変数として取り扱う際の情報を参照する位置づけになります。 サンプルに__isaの内容を呼び出すプログラムも書いてみました。 ==== サンプル ==== shape={"sides":0} //クラスが持ってる変数の定義。(マップとして定義する) square = new shape //先程定義した変数をクラスと見てインスタンスを作成 square.sides=3 //作成したインスタンスのメンバ変数を書き換え square //インスタンスの情報を表示 square.__isa //__isaエントリを確認。今のところメンバ変数sidesのみ記載 x=new square //さっき作ったインスタンスをクラスと見てインスタンスを作成(継承の取り扱い) print x.sides //継承したインスタンスのメンバ変数を表示 shape.puresq=function //メソッド(関数)の定義。言ってしまうと「クラスを作ってしまった後から」クラスに追記することになる return self.sides*self.sides //sidesというメンバ変数の二乗を返す end function print x.puresq() //作成したメソッドをインスタンスから呼び出し square //インスタンスの情報を表示(見かけ変わってないですね) square.__isa //__isaにはクラスの情報が書かれている。ここでpuresqメソッドが加わっていることを確認 ==== サンプル出力 ==== {{:oop:20230114_output.png|}}