Question

Si j’ai un objet, comment puis-je déterminer son type? (Existe-t-il un équivalent OCaml de l'opérateur instanceof de Java?)

Était-ce utile?

La solution

OCaml utilise le typage structural pour les objets plutôt que le typage nominatif comme en Java. Ainsi, le type d'un objet est essentiellement déterminé (et uniquement déterminé) par ses méthodes. Les objets dans OCaml peuvent être créés directement, sans passer par une classe.

Vous pouvez écrire des fonctions nécessitant que ses objets argument aient certaines méthodes (et que ces méthodes aient certains types); par exemple, la méthode suivante prend un argument qui est un objet quelconque avec une méthode "bar":

let foo x = x#bar

Autres conseils

Il existe une discussion sur les & Match; Objets correspondant à des motifs & ; sur Lambda the Ultimate (le document utilise Scala comme langue, il ne répondra donc pas à votre question). Liste de diffusion d'Ocaml indique qu'il n'y a pas de RTTI / safe-downcasting pour les objets.

Pour les types algébriques (non objets), vous avez évidemment:

match expr with 
  Type1 x -> x
  Type2 (x,y) -> y

appelé correspondance (motif)

Quelqu'un a écrit une extension qui permet de convertir des objets Ocaml vers le bas / vers le haut.

En bref, vous devez encoder votre propre mécanisme RTTI. OCaml ne fournit pas de RTTI ni de transtypage haut / bas (ce dernier est en partie dû au fait que l'héritage et le sous-typage sont orthogonaux dans OCaml et non unifiés comme dans Java).

Vous pouvez utiliser des chaînes ou des variantes polymorphes pour coder les informations de type dans vos classes et objets. Je crois que LablGTK fait une partie de cela et fournit une bibliothèque d’utilitaires pour supporter le marquage d’objet et la diffusion ascendante / descendante.

Un peu en dehors du sujet, mais le langage OPA (qui s'appuie énormément sur certains aspects d'OCaml) , permet l'équivalent de la correspondance de motif sur les objets. C'est donc tout à fait faisable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top