オブジェクトがある場合、そのタイプをどのように判断できますか? instanceof
(Javaの演算子に相当するOCamlはありますか?)
4 に答える
OCaml には、Java のような主格型付けではなく、オブジェクトの構造型付けがあります。したがって、オブジェクトの型は基本的にそのメソッドによって決定されます (そして決定されるだけです)。OCaml のオブジェクトは、クラスなどを介さずに直接作成できます。
引数オブジェクトが特定のメソッドを持っていること (およびそれらのメソッドが特定の型を持っていること) を必要とする関数を書くことができます。たとえば、次のメソッドは、メソッド「bar」を持つ任意のオブジェクトを引数に取ります。
let foo x = x#bar
つまり、独自の RTTI メカニズムをエンコードする必要があります。OCaml は RTTI やアップ/ダウン キャストを提供しません (後者の理由の 1 つは、Java のように統一されているのではなく、OCaml では継承とサブタイプが直交しているためです)。
クラスやオブジェクトの型情報をエンコードするために、文字列またはポリモーフィック バリアントを使用して何かを行うことができます。LablGTK がこれの一部を行い、オブジェクトのタグ付けとアップ/ダウン キャストをサポートするユーティリティ ライブラリを提供していると思います。
やや話題から外れていますが、OPA 言語(OCaml のいくつかの側面から大きく引き出されている) では、オブジェクトのパターン マッチングと同等のことが可能です。なので十分実現可能です。