Nếu tôi có đối tượng, làm cách nào để xác định loại đối tượng? (Có một OCaml tương đương với toán tử instanceof
của Java không?)OCaml: Loại đối tượng kiểm tra
Trả lời
OCaml có kiểu nhập cấu trúc cho các đối tượng chứ không phải gõ đánh máy như trong Java. Vì vậy, loại đối tượng cơ bản được xác định (và chỉ được xác định) bằng các phương pháp của nó. Các đối tượng trong OCaml có thể được tạo trực tiếp, mà không phải trải qua một thứ gì đó giống như một lớp.
Bạn có thể viết các hàm yêu cầu đối tượng đối số của nó có các phương thức nhất định (và các phương thức đó có các kiểu nhất định); ví dụ: phương thức sau có một đối số là bất kỳ đối tượng nào có phương thức "bar":
let foo x = x#bar
Có một cuộc thảo luận về "Matching Objects With Patterns" trên Lambda the Ultimate (giấy sử dụng Scala làm ngôn ngữ, vì vậy sẽ không trả lời câu hỏi của bạn). Một liên quan hơn Ocaml mailing list thread cho biết rằng không có RTTI/an toàn-downcasting cho các đối tượng.
Đối với đại số (không đối tượng) các loại bạn rõ ràng có:
match expr with
Type1 x -> x
Type2 (x,y) -> y
Có người đã viết một extension cho phép down/up-đúc tượng Ocaml.
Tôi đang gặp khó khăn trong việc làm việc này. Tôi đã thực hiện khớp mẫu cho các giá trị trong một loại nhưng không khớp với nhiều giá trị. –
Có sự khác biệt giữa các đối tượng và các loại đại số. Hầu hết mọi người dường như thích để tránh các đối tượng của Ocaml và sử dụng functors + các loại đại số cho genericity. –
Tóm lại, bạn phải mã hóa cơ chế RTTI của riêng mình. OCaml cung cấp không có RTTI hoặc lên/xuống đúc (sau này một phần vì thừa kế và subtyping là trực giao trong OCaml hơn là thống nhất như trong Java).
Bạn có thể làm điều gì đó bằng chuỗi hoặc biến thể đa hình để mã hóa thông tin loại trong lớp và đối tượng của bạn. Tôi tin rằng LablGTK thực hiện một số điều này, và cung cấp một thư viện tiện ích để hỗ trợ việc gắn thẻ đối tượng và lên/xuống.
Hơi lệch chủ đề, nhưng the OPA language (được vẽ nhiều từ một số khía cạnh của OCaml), cho phép tương đương với đối sánh mẫu trên các đối tượng. Vì vậy, nó khá khả thi.
- 1. Cách hiệu quả nhất để kiểm tra loại đối tượng
- 2. Kiểm tra các loại đối tượng trong C++ 11
- 3. Kiểm tra NSPredicate cho loại đối tượng lớp
- 4. Thực hiện kiểm tra đôi trong OCaml
- 5. Cách kiểm tra loại hiện tại (đối tượng Loại) có cần giao diện (hoặc loại gốc)
- 6. Cách kiểm tra đối tượng (đối tượng ActiveRecord)
- 7. Kiểm tra chuỗi con tại Ocaml
- 8. Đối tượng trong các đối tượng trong OCaml
- 9. loại ocaml trong một loại
- 10. PHPUnit: Kiểm tra mảng đối tượng
- 11. Trình kiểm tra đối tượng Python GUI
- 12. Casperjs kiểm tra đối tượng javascript
- 13. Kiểm tra loại biến
- 14. Loại kiểm tra trong C++
- 15. Kiểm tra xem một đối tượng là một Enum
- 16. Cách kiểm tra đối tượng phụ thuộc COM trong C#
- 17. Kiểm tra loại hình Danh sách đối tượng <?> chứa
- 18. Cách kiểm tra xem hai đối tượng có cùng loại trong Actionscript không?
- 19. Trong mục tiêu-C, làm cách nào để kiểm tra loại đối tượng?
- 20. Cách chính xác nhất để kiểm tra loại đối tượng JS là gì?
- 21. Kiểm tra xem loại đối tượng có kế thừa kiểu tóm tắt
- 22. Làm cách nào để kiểm tra xem đối tượng có thuộc loại cụ thể không?
- 23. Cách kiểm tra xem đối tượng có phải là một mảng của một loại nhất định
- 24. Kiểm tra xem đối tượng là KHÔNG loại (! = Tương đương cho "LÀ") - C#
- 25. Làm cách nào để kiểm tra loại đối tượng trong C++/CLI?
- 26. Làm cách nào để xem loại thuộc tính trong Trình kiểm tra đối tượng?
- 27. đó là cách tiếp cận tốt hơn để kiểm tra loại đối tượng
- 28. Cách kiểm tra xem đối tượng có phải là một loại nhất định
- 29. Kiểm tra loại Prolog
- 30. Kiểm tra thuộc tính QuickCheck đối với nhiều loại?
bạn có thể đăng một số mã không, vì thông thường bạn biết loại đối tượng khi bạn đang xử lý nó – 0xFF