Wenn ich ein Objekt habe, wie kann ich seinen Typ feststellen? (Gibt es ein OCaml entspricht Java instanceof
Operator?)OCaml: Typ prüfen Objekte
Antwort
OCaml hat strukturelle Typisierung für Objekte anstelle von Nominativ Typisierung wie in Java. Der Typ eines Objekts wird also grundsätzlich durch seine Methoden bestimmt (und nur bestimmt). Objekte in OCaml können direkt erstellt werden, ohne etwas wie eine Klasse zu durchlaufen.
Sie können Funktionen schreiben, die erfordern, dass ihre Argumentobjekte bestimmte Methoden haben (und dass diese Methoden bestimmte Typen haben); nimmt beispielsweise das folgende Verfahren ein Argument, das jedes Objekt mit einer Methode „bar“ ist:
let foo x = x#bar
Es gibt eine Diskussion über "Matching Objects With Patterns" auf Lambda the Ultimate (das Papier verwendet Scala als Sprache, so wird Ihre Frage nicht beantworten). Eine relevantere Ocaml mailing list thread zeigt an, dass es keine RTTI/Safe-Downcasting für Objekte gibt.
Für algebraische (non-Objekt) Typen haben Sie offensichtlich:
match expr with
Type1 x -> x
Type2 (x,y) -> y
(pattern) matching genannt
Jemand hat eine extension schreiben,/ermöglicht down up-Casting Ocaml Objekte.
Ich habe eine harte Zeit, damit dies funktioniert. Ich habe einen Mustervergleich für Werte innerhalb eines Typs durchgeführt, aber nicht für mehrere. –
Es gibt einen Unterschied zwischen Objekten und algebraischen Typen. Die meisten Menschen scheinen es vorzuziehen, Ocamls Objekte zu vermeiden und Funktoren + algebraische Typen für die Generizität zu verwenden. –
Kurz gesagt, müssen Sie Ihren eigenen RTTI-Mechanismus kodieren. OCaml bietet keine RTTI oder Up/Down Casting (letzteres zum Teil, weil Vererbung und Subtyping in OCaml eher orthogonal als in Java vereinheitlicht sind).
Sie könnten etwas mit Strings oder polymorphen Varianten machen, um Typinformationen in Ihren Klassen und Objekten zu kodieren. Ich glaube, dass LablGTK einiges davon tut und eine Utility-Bibliothek zur Unterstützung von Objekt-Tags und Up/Down-Castings bietet.
Etwas out-of-topic, aber the OPA language (die stark von einigen Aspekten von OCaml bezieht), ermöglicht das Äquivalent von Mustervergleich auf Objekten. Es ist also durchaus machbar.
- 1. OCaml-Typ des Plusoperators
- 2. Objekte in Objekten in OCaml
- 3. UML für OCaml sofortige Objekte
- 4. OCaml functors und Typ Themen
- 5. ocaml Typ innerhalb eines Typs
- 6. OCaml: Typ Einschränkungen in Signaturen
- 7. Unbekannter Typ Fehler in OCaml
- 8. OCaml - Was ist ein ungesunder Typ?
- 9. OCaml Typ Bindung in rekursiven Modulen
- 10. CPS in OCaml: Typ überprüft nicht
- 11. Identifizierung hashtable als benutzerdefinierten Typ in OCaml
- 12. Funktion Signatur als Typ in OCaml
- 13. OCaml bauen Fehler: Typ int statt vom Typ Einheit
- 14. Prüfen ob zwei Objekte sich gegenüber stehen
- 15. OCaml Besuchermuster
- 16. prüfen Objekttyp nicht „ist kein Typ“ Fehler
- 17. Den Typ einer inneren Ausnahme prüfen
- 18. Prüfen, ob die Liste einen Typ enthält?
- 19. Wechsel „Typ“ von Python Objekte
- 20. Typ von on-the-fly in OCaml OOP-Konstrukt
- 21. Wie werden OCaml-Modultypen (Signaturen), die denselben Typ definieren, zusammengeführt?
- 22. Was ist der ocaml Typ 'a. 'a ->' ein Mittelwert?
- 23. Erstellen einer Multiplikationstabelle vom Typ int Array-Array in OCaml
- 24. toString() entspricht in OCaml
- 25. Was sind "" in OCaml?
- 26. Parameterized Typen in OCaml
- 27. OCaml/Grund Design-Module
- 28. Option String in ocaml
- 29. Funktoren in Ocaml
- 30. OCaml Option get
könnten Sie etwas Code posten, weil Sie normalerweise den Objekttyp kennen, wenn Sie ihn bearbeiten – 0xFF