الأنواع المعتمة في 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 للحصول على الكنز دون أن تعرف كلمة المرور.
لنُصلح ذلك باستخدام نوع معتم.
TreasureChest.يحتوي TreasureChest على حقلين:
String.يجب أن يكون النوع TreasureChest معتمًا.
create.تأخذ هذه الدالة وسيطين:
String.تُرجع الدالة TreasureChest يحتوي على كلمة المرور والقيمة.
إذا كانت كلمة المرور أقصر من 8 أحرف، فيجب أن تُرجع الدالة خطأً نصه Password must be at least 8 characters long.
open.تأخذ هذه الدالة وسيطين:
TreasureChest.String.إذا طابقت كلمة المرور كلمة المرور الموجودة في TreasureChest، فيجب أن تُرجع الدالة الكنز، وإلا فيجب أن تُرجع خطأً نصه Incorrect password.
سجّل في Exercism لتتعلّم وتتقن Gleam عبر 33 مفهومًا122 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.