سؤال

في لغة الهاك نظام الكتابة، هل يوجد نوع "علوي"، يُعرف أيضًا بالنوع "أي"، أو نوع "كائن" عالمي؟أي نوع تكون جميع الأنواع فئات فرعية منه؟

يذكر الدليل الأنواع "المختلطة"., ، والتي قد تكون مشابهة، ولكن لم يتم شرحها حقًا.هناك أيضًا إمكانية حذف تعريف النوع في بعض الأماكن.ومع ذلك، لا يمكن القيام بذلك في كل مكان، على سبيل المثال.إذا كنت أرغب في الإعلان عن شيء ما ليكون وظيفة من string إلى النوع العلوي، ليس من الواضح كيف أفعل ذلك. function (string): mixed?

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

المحلول

أنا مهندس أعمل على Hack في الفيسبوك.هذا سؤال ثاقبة ومثيرة للاهتمام حقا.اعتمادًا على ما تحصل عليه بالضبط، لدى Hack عدة أشكال مختلفة من هذا.

أولا، دعونا نتحدث عن mixed.إنه النوع الفائق من كل شيء.على سبيل المثال، يقوم هذا النوع بالتحقق من:

<?hh // strict
function f(): mixed {
  return 42;
}

ولكن نظرًا لأنه النوع الفائق من كل شيء، فلا يمكنك فعل الكثير باستخدامه mixed القيمة حتى تقوم بتحليل الحالة على ما هي عليه بالفعل، عبر is_int, instanceof, ، إلخ.فيما يلي مثال لكيفية استخدام نتيجة f():

<?hh // strict
function g(): int {
  $x = f();
  if (is_int($x)) {
    return $x;
  } else {
    return 0;
  }
}

يختلف نوع "التعليق التوضيحي المفقود" ("أي") إلى حد ما عن هذا.بينما mixed هو النوع الفائق من كل شيء، "أي" يوحد مع كل شيء-- كلاهما من النوع الفائق و النوع الفرعي من كل شيء.وهذا يعني أنه إذا تركت تعليقًا توضيحيًا، فسوف نفترض أنك تعرف ما تفعله ونتركه يمر.على سبيل المثال، يتم التحقق من نوع التعليمات البرمجية التالية كما هو مكتوب:

<?hh
// No "strict" since we are omitting annotations
function f2() {
  return 42;
}
function g2(): string {
  return f2();
}

من الواضح أن هذا ليس سليمًا - لقد قمنا للتو بكسر نظام الكتابة وسوف نتسبب في حدوث خطأ في النوع في وقت التشغيل إذا قمنا بتنفيذ التعليمات البرمجية أعلاه - ولكن تم قبوله في الوضع الجزئي لتسهيل التحويل.يتطلب Strict أن تقوم بالتعليق على كل شيء، وبالتالي لا يمكنك الحصول على قيمة من النوع "any" لكسر نظام الكتابة بهذه الطريقة إذا كانت جميع التعليمات البرمجية الخاصة بك صارمة.فكر في كيفية إضافة تعليق توضيحي للكود أعلاه في الوضع الصارم:أيضاً f2 سوف تضطر إلى العودة int وسيكون ذلك خطأً مباشرًا في النوع ("السلسلة غير متوافقة مع int")، أو f2 سوف تضطر إلى العودة mixed وسيكون ذلك خطأً في الكتابة كما هو مكتوب ("السلسلة غير متوافقة مع المختلط") حتى تقوم بتحليل الحالة is_int إلخ كما فعلت في مثالي السابق.

آمل أن يكون هذا واضحًا - إذا كنت تريد التوضيح، فأخبرني بذلك في التعليقات وسأقوم بالتعديل.وإذا كانت لديك أسئلة أخرى لا تمثل توضيحًا صارمًا لهذا الأمر، فاستمر في وضع علامة "hacklang" عليها وسنتأكد من الرد عليها!

أخيراً:إذا كنت لا تمانع، هل يمكنك الضغط على "ملف خطأ التوثيق" في صفحات المستندات التي كانت مربكة أو غير واضحة، أو يمكن تحسينها بأي شكل من الأشكال؟نريد بشكل مثالي أن يكون docs.hhvm.com مكانًا شاملاً لأشياء مثل هذه، ولكن هناك بالتأكيد ثغرات في المستندات التي نأمل أن يساعد الأشخاص الأذكياء والمتحمسين مثلك في توضيحها.(على سبيل المثال، اعتقدت أن هذه الأشياء قد تم شرحها جيدًا في المستندات، ولكن بما أنك في حيرة من أمرك فمن الواضح أن هذا ليس هو الحال، ونحن نقدر حقًا تقرير الأخطاء الذي يوضح بالتفصيل المكان الذي ضاعت فيه.)

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