مسیرها
/
Gleam
Gleam
/
تمرین‌ها
/
صندوق گنج امن
صندوق گنج امن

صندوق گنج امن

تمرین یادگیری

مقدمه

نوع مات

«نوع مات» در Gleam نوعی سفارشی است که فقط ماژولی که آن نوع را تعریف می‌کند می‌تواند مقدارهایی از آن نوع را بسازد یا با آن‌ها تطبیق الگو کند. این ویژگی برای ساختن نوع‌هایی مفید است که باید فقط به روشی خاص استفاده شوند.

نوع مات با کلیدواژه‌ی opaque تعریف می‌شود.

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

این نوع PositiveInt برای موقعیت‌هایی است که در آن‌ها یک عدد صحیح لازم است، اما آن عدد باید صفر یا بزرگ‌تر باشد. نمی‌توان از Int معمولیِ Gleam استفاده کرد، چون آن‌ها هم می‌توانند منفی باشند.

ماژولی که این نوع را تعریف می‌کند می‌تواند تابعی برای گرفتن مقدار عدد صحیح درونی تعریف کند و همچنین تابعی برای ساختن نوع 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 برمی‌گرداند که رمز عبور و آن مقدار را در خود دارد.

اگر رمز عبور کوتاه‌تر از ۸ کاراکتر باشد، تابع باید خطایی برگرداند با این پیام که Password must be at least 8 characters long.

3. تابع open را تعریف کنید

این تابع دو آرگومان می‌گیرد:

  • یک TreasureChest.
  • یک رمز عبور از نوع String.

اگر رمز عبور با رمز عبور موجود در TreasureChest یکسان باشد، تابع باید گنج را برگرداند؛ در غیر این صورت، باید خطایی برگرداند با این پیام که Incorrect password.

ویرایش از طریق GitHub این لینک در پنجره یا زبانه‌ی جدیدی باز می‌شود
Gleam Exercism

آماده‌اید صندوق گنج امن را شروع کنید؟

در Exercism ثبت‌نام کنید تا Gleam را همراه با 33 مفهوم122 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.