المسارات
/
Gleam
Gleam
/
التمارين
/
صندوق الكنز الآمن
صندوق الكنز الآمن

صندوق الكنز الآمن

تمرين تعلّمي

مقدمة

الأنواع المعتمة

الأنواع المعتمة في Gleam هي أنواع مخصصة لا يمكن إلا للوحدة التي تُعرّف النوع إنشاء قيم من ذلك النوع أو مطابقتها بالأنماط. هذا مفيد لإنشاء أنواع يجب استخدامها بطريقة محددة فقط.

تُعرّف الأنواع المعتمة باستخدام الكلمة المفتاحية opaque.

pub opaque type PositiveInt {
  PositiveInt(inner: Int)
}

يُستخدم هذا النوع PositiveInt في الحالات التي يُراد فيها عدد صحيح، لكن يجب أن يكون صفرًا أو أكبر. لا يمكن استخدام Int العادي في Gleam لأن قيم Int يمكن أن تكون سالبة أيضًا.

يمكن للوحدة التي تُعرّف هذا النوع أن تُعرّف دالة للحصول على قيمة العدد الصحيح الداخلية، ودالة لإنشاء النوع PositiveInt ستُرجع خطأً إذا لم تكن القيمة موجبة.

pub fn from_int(i: Int) -> Result(PositiveInt, String) {
  case i {
    _ if i < 0 -> Error("Value must be positive")
    _ -> Ok(PositiveInt(i))
  }
}

pub fn to_int(i: PositiveInt) -> Int {
  i.inner
}

باستخدام API، لا يمكن للوحدات الأخرى إنشاء PositiveInt بقيمة سالبة، لذا يمكن لأي دالة تأخذ PositiveInt أن تتأكد من أن القيمة موجبة.

التعليمات

لاحظ الطلاب ذوو البصر الثاقب أن النوع TreasureChest في التمرين السابق لم يكن آمنًا إلى هذا الحد!

إذا استخدمت الدالة get_treasure كان عليك تقديم كلمة المرور، لكن كان بإمكانك مع ذلك تفكيك النوع TreasureChest للحصول على الكنز دون أن تعرف كلمة المرور.

لنُصلح ذلك باستخدام نوع معتم.

1. عرّف النوع المعتم TreasureChest.

يحتوي TreasureChest على حقلين:

  • كلمة مرور من النوع String.
  • كنز من نوع عام.

يجب أن يكون النوع TreasureChest معتمًا.

2. عرّف الدالة create.

تأخذ هذه الدالة وسيطين:

  • كلمة مرور من النوع String.
  • قيمة كنز من أي نوع.

تُرجع الدالة TreasureChest يحتوي على كلمة المرور والقيمة.

إذا كانت كلمة المرور أقصر من 8 أحرف، فيجب أن تُرجع الدالة خطأً نصه Password must be at least 8 characters long.

3. عرّف الدالة open.

تأخذ هذه الدالة وسيطين:

  • قيمة من النوع TreasureChest.
  • كلمة مرور من النوع String.

إذا طابقت كلمة المرور كلمة المرور الموجودة في TreasureChest، فيجب أن تُرجع الدالة الكنز، وإلا فيجب أن تُرجع خطأً نصه Incorrect password.

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

مستعد لبدء صندوق الكنز الآمن؟

سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.