الأنواع المخصصة هي الطريقة التي تُعرَّف بها أنواع البيانات الجديدة في Gleam. يمكن أن تحتوي على عدة حالات، لكل منها اسمه الخاص.
pub type Season {
Spring
Summer
Autumn
Winter
}
يمكن لكل حالة من حالات النوع المخصص أن تحمل بعض البيانات اختياريًا، ويمكن أن تحتوي الحالات المختلفة على أنواع مختلفة من البيانات. عندما تحمل الحالة بيانات، فإنها تسمى سجلًا.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
يمكن إنشاء قيمة لحالة محددة بالإشارة إلى اسمها إذا لم تكن تحتوي على بيانات إضافية (Spring)، أو باستدعائها كدالة إذا كانت تحتوي عليها (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
الأنواع المخصصة، مثل كل شيء في Gleam، لديها تساوٍ بنيوي، ما يعني أن قيمتين من الحالة نفسها وبالبيانات نفسها متكافئتان.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
يمكن إجراء مطابقة الأنماط على حالات الأنواع المخصصة باستخدام تعبيرات case.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
في هذا التمرين، إنه عيد الحب، وأنت وشريكك تخططان للقيام بشيء لطيف معًا. لدى شريكك الكثير من الأفكار، وهو الآن يطلب منك تقييم الأفكار، لإيجاد النشاط الذي ستمارسانِه.
الأفكار التالية مقترحة من شريكك:
لديك ست مهام تساعدك على اختيار نشاط عيد الحب.
لكل فكرة يقترحها شريكك، تردّ بأحد ثلاثة خيارات: نعم أو لا أو ربما.
عرّف النوع المخصص Approval لتمثيل هذه الخيارات بالحالات الثلاث التالية: Yes وNo وMaybe.
اختار شريكك مطعمين محتملين: أحدهما مطبخه كوري والآخر مطبخه تركي.
عرّف النوع المخصص Cuisine لتمثيل هذين المطبخين بالحالتين التاليتين: Korean وTurkish.
هناك عدد هائل من الأفلام للاختيار منها، ولتضييق الخيارات، يذكر شريكك أيضًا تصنيفها الفني.
عرّف النوع المخصص Genre لتمثيل الأنواع الفنية التالية كحالات: Crime وHorror وRomance وThriller.
كما قلنا، اقترح شريكك خمسة أنشطة مختلفة: لعب لعبة لوحية، والاسترخاء، ومشاهدة فيلم، والذهاب إلى مطعم، والمشي.
عرّف النوع المخصص Activity لتمثيل أنواع الأنشطة هذه:
BoardGame: لا توجد بيانات مرتبطة.Chill: لا توجد بيانات مرتبطة.Movie: لديه Genre كبيانات مرتبطة.Restaurant: لديه Cuisine كبيانات مرتبطة.Walk: لديه Int يمثّل عدد الكيلومترات التي سيتم مشيها كبيانات مرتبطة.أخيرًا، أصبحت مستعدًا لتقييم أفكار شريكك. هكذا تشعر تجاه فكرة شريكك:
نفّذ دالة باسم rate_activity تأخذ قيمة Activity وتُرجع Approval بناءً على المشاعر المذكورة أعلاه:
rate_activity(Restaurant(Turkish))
// -> Maybe
سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.