المسارات
/
Elixir
Elixir
/
المنهج
/
مواصفات الأنواع
مو

مواصفات الأنواع في Elixir

1 تمرين

نبذة عن مواصفات الأنواع

Elixir لغة ذات أنواع ديناميكية، أي أنها لا توفّر فحوصات للأنواع في وقت الترجمة. ومع ذلك، يمكن أن تكون مواصفات الأنواع مفيدة لأنها:

  • تكون بمثابة توثيق.
  • يمكن أن تستخدمها أدوات التحليل الساكن مثل Dialyzer للكشف عن bug محتملة.

يمكن إضافة مواصفة نوع إلى دالة باستخدام سمة الوحدة @spec مباشرةً قبل تعريف الدالة.

@spec longer_than?(String.t(), non_neg_integer()) :: boolean()
def longer_than?(string, length), do: String.length(string) > length

الأنواع

التعبيرات المسموح بها في مواصفة النوع:

  • أنواع أساسية، مثال:

    • boolean()
    • integer(), non_neg_integer(), pos_integer(), float()
    • list()
    • map()
    • any()
  • اتحاد أنواع:

    • مثال: integer() | list(integer())
  • أنواع ذات معاملات:

    • مثال: list(integer()) مصفوفة من الأعداد الصحيحة
    • مثال: %{age: integer()} خريطة تحمل قيمة عددية تحت المفتاح :age
  • أنواع بعيدة (معرّفة في وحدة ما)، مثال:

  • قيم حرفية، مثال:

    • %{} خريطة فارغة
    • [] مصفوفة فارغة (لكن [any()] مصفوفة غير فارغة)
    • مثال: :ok قيمة ذرية حرفية
  • أنواع مدمجة متخصصة، مثال:

    • char() عدد صحيح من النطاق 0..0x10FFFF
    • charlist() مصفوفة من المحارف
    • keyword() مصفوفة من أزواج من عنصرين، يكون العنصر الأول فيها ذرةً
  • أنواع مخصصة

تجد القائمة الكاملة لكل الأنواع في قسم "Typespecs" في التوثيق الرسمي.

تسمية الوسائط

يمكن أيضًا تسمية الوسائط في مواصفة النوع، وهذا مفيد للتمييز بين عدة وسائط من النوع نفسه.

@spec to_hex({hue :: integer, saturation :: integer, lightness :: integer}) :: String.t()

أنواع مخصصة

يمكن تعريف أنواع مخصصة باستخدام إحدى سمات الوحدة الثلاث:

  • @type تعرّف نوعًا عامًا
  • @typep تعرّف نوعًا خاصًا
  • @opaque تعرّف نوعًا عامًا تكون بنيته خاصة
@type color :: {hue :: integer, saturation :: integer, lightness :: integer}

@spec to_hex(color()) :: String.t()

String.t() مقابل binary() مقابل string()

String.t() هو النوع الصحيح لسلاسل Elixir النصية، وهي بيانات ثنائية بترميز UTF-8. من الناحية التقنية، يُعرَّف String.t() على أنه binary()، والنوعان متكافئان بالنسبة لأدوات التحليل، لكن String.t() هو الخيار الأكثر كشفًا للنية عند توثيق الدوال التي تتعامل مع سلاسل Elixir النصية.

في المقابل، النوع string() نوع مختلف. فهو سلسلة نصية بلغة Erlang، تُعرف في Elixir باسم قائمة المحارف. ينبغي تجنّب النوع string() في مواصفات الأنواع، واستخدام charlist() بدلًا منه.

Dialyzer

Dialyzer أداة تحليل ساكن تستطيع كشف مشكلات مثل أخطاء الأنواع في كود Erlang و Elixir. وأسهل أسلوب لاستخدام Dialyzer في مشروع Elixir هو Dialyxir.

تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة

تعلّم مواصفات الأنواع