در Elixir، مقادیر «درست» و «غلط» با نوع دادهی «منطقی» نمایش داده میشوند. فقط دو مقدار وجود دارد: true و false. میتوان این مقادیر را به یک متغیر نسبت داد:
true_variable = true
false_variable = false
میتوانیم عبارتهای منطقی سختگیرانه را با عملگرهای and/2، or/2 و not/1 ارزیابی کنیم.
true_variable = true and true
false_variable = true and false
true_variable = false or true
false_variable = false or false
true_variable = not false
false_variable = not true
وقتی تابعی مینویسید که یک مقدار منطقی برمیگرداند، مرسوم است که اسم تابع را با ? تمام کنید. همین قرارداد را میتوان برای متغیرهایی به کار برد که مقادیر منطقی را نگه میدارند.
def either_true?(a?, b?) do
a? or b?
end
در این تمرین، باید چند قانون از بازی کلاسیک Pac-Man را به توابع Elixir ترجمه کنید.
چهار قانون برای ترجمه دارید که همه به وضعیتهای بازی مربوط میشوند.
نگران این نباشید که آرگومانها چطور به دست میآیند؛ فقط روی ترکیب آرگومانها تمرکز کنید تا نتیجهی موردنظر برگردانده شود.
تابع Rules.eat_ghost?/2 را تعریف کنید که دو آرگومان میگیرد (اینکه آیا Pac-Man قرص قدرت فعال دارد و اینکه آیا Pac-Man با یک شبح در تماس است) و «مقدار منطقی» را برمیگرداند که نشان میدهد آیا Pac-Man میتواند شبح را بخورد. تابع باید تنها زمانی «درست» را برگرداند که Pac-Man قرص قدرت فعال داشته باشد و با یک شبح در تماس باشد.
Rules.eat_ghost?(false, true)
# => false
تابع Rules.score?/2 را تعریف کنید که دو آرگومان میگیرد (اینکه آیا Pac-Man با یک قرص قدرت در تماس است و اینکه آیا Pac-Man با یک نقطه در تماس است) و یک مقدار منطقی برمیگرداند که نشان میدهد آیا Pac-Man امتیاز گرفته است. اگر Pac-Man با یک قرص قدرت یا یک نقطه در تماس باشد، تابع باید «درست» را برگرداند.
Rules.score?(true, true)
# => true
تابع Rules.lose?/2 را تعریف کنید که دو آرگومان میگیرد (اینکه آیا Pac-Man قرص قدرت فعال دارد و اینکه آیا Pac-Man با یک شبح در تماس است) و یک مقدار منطقی برمیگرداند که نشان میدهد آیا Pac-Man میبازد. اگر Pac-Man با یک شبح در تماس باشد و قرص قدرت فعالی نداشته باشد، تابع باید «درست» را برگرداند.
Rules.lose?(false, true)
# => true
تابع Rules.win?/3 را تعریف کنید که سه آرگومان میگیرد (اینکه آیا Pac-Man همهی نقطهها را خورده است، اینکه آیا Pac-Man قرص قدرت فعال دارد و اینکه آیا Pac-Man با یک شبح در تماس است) و یک مقدار منطقی برمیگرداند که نشان میدهد آیا Pac-Man میبرد. اگر Pac-Man همهی نقطهها را خورده باشد و بر اساس آرگومانهای تعریفشده در بخش ۳ نباخته باشد، تابع باید «درست» را برگرداند.
Rules.win?(false, true, false)
# => false