سؤال

إذا كان لدي كائن كيف يمكنني تحديد نوعه؟(هل هناك OCaml يعادل Java instanceof المشغل أو العامل؟)

هل كانت مفيدة؟

المحلول

ولغة كامل الموضوعية ديه في الكتابة الهيكلية للكائنات بدلا من الكتابة اسمية كما في جاوة. لذلك النوع من كائن يتحدد أساسا (ويتحدد فقط) من خلال وسائلها. الكائنات في لغة كامل الموضوعية يمكن أن تنشأ مباشرة، دون المرور عبر ما يشبه الطبقة.

ويمكنك كتابة وظائف التي تتطلب أن الأجسام حجتها لديها وسائل معينة (وأن تلك الطرق لها أنواع معينة)؛ على سبيل المثال، يأخذ الطريقة التالية وهي حجة من أي كائن مع أسلوب "بار":

let foo x = x#bar

نصائح أخرى

هناك مناقشة "مطابقة الكائنات مع الأنماط" على لامدا في نهاية المطاف (تستخدم الورقة Scala كلغة، لذا لن تجيب على سؤالك).وأكثر أهمية موضوع القائمة البريدية Ocaml يشير إلى عدم وجود RTTI/البث الآمن للكائنات.

بالنسبة للأنواع الجبرية (غير الكائنية) فمن الواضح أن لديك:

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

مُسَمًّى (نمط مطابقة

شخص ما كتب امتداد يسمح بإسقاط/أعلى كائنات Ocaml.

وباختصار، لديك لترميز آلية RTTI الخاصة بك. يوفر لغة كامل الموضوعية لا RTTI أو أعلى / أسفل الصب (هذا الأخير وذلك جزئيا بسبب الميراث والتصنيف الفرعي متعامدة في لغة كامل الموضوعية بدلا من توحيد كما هو الحال في جاوة).

هل يمكن أن تفعل شيئا مع سلاسل أو متغيرات متعددة الأشكال لترميز المعلومات نوع في الطبقات والأشياء الخاصة بك. وأعتقد أن LablGTK يفعل بعض من هذا، وتوفر مكتبة فائدة لدعم العلامات الكائن وأعلى / أسفل الصب.

وإلى حد ما خارج الموضوع، ولكن اللغة OPA (والذي يعتمد اعتمادا كبيرا من بعض جوانب لغة كامل الموضوعية) ، بما يسمح لليعادل نمط مطابقة على الكائنات. لذلك فمن الممكن تماما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top