Option টাইপ এমন মান প্রকাশ করতে ব্যবহার করা হয়, যেগুলো হয় অনুপস্থিত, নয়তো উপস্থিত থাকে।
এটি gleam/option মডিউলে এভাবে ডিফাইন করা আছে:
type Option(a) {
Some(a)
None
}
কোনো মান উপস্থিত থাকলে সেটি মুড়ে দিতে Some কনস্ট্রাক্টর ব্যবহার করা হয়, আর মানের অনুপস্থিতি বোঝাতে None কনস্ট্রাক্টর ব্যবহার করা হয়।
Option-এর ভেতরের কনটেন্ট অ্যাক্সেস করতে প্রায়ই প্যাটার্ন ম্যাচিং ব্যবহার করা হয়।
import gleam/option.{type Option, None, Some}
pub fn say_hello(person: Option(String)) -> String {
case person {
Some(name) -> "Hello, " <> name <> "!"
None -> "Hello, Friend!"
}
}
say_hello(Some("Matthieu"))
// -> "Hello, Matthieu!"
say_hello(None)
// -> "Hello, Friend!"
gleam/option মডিউলে Option টাইপ নিয়ে কাজ করার জন্য আরও কিছু দরকারি ফাংশন ডিফাইন করা আছে, যেমন unwrap, যা Option-এর কনটেন্ট রিটার্ন করে, আর মানটি None হলে একটি ডিফল্ট মান রিটার্ন করে।
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
জশ একটি নতুন রোল-প্লেয়িং গেম তৈরি করছে এবং এর কিছু মেকানিক ইমপ্লিমেন্ট করতে আপনার সাহায্য প্রয়োজন।
introduce ফাংশনটি ইমপ্লিমেন্ট করুন।
স্টিলথি প্লেয়াররা হয়তো তাদের নাম গোপন করে থাকতে পারেন এবং "Mighty Magician" হিসেবে পরিচয় দেওয়া হবে।
অন্যথায়, পরিচয় দিতে শুধু প্লেয়ারের নামটি ব্যবহার করুন।
introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"
introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"
revive ফাংশনটি যাচাই করবে যে প্লেয়ারের ক্যারেক্টারটি সত্যিই মৃত (তাদের হেলথ ০-এ পৌঁছেছে)।
তারা মৃত হলে, এটি ১০০ হেলথসহ নতুন একটি Player ইনস্ট্যান্স রিটার্ন করবে।
অন্যথায়, প্লেয়ারের ক্যারেক্টারটি মৃত না হলে, revive ফাংশনটি None রিটার্ন করে।
প্লেয়ারের লেভেল ১০ বা তার বেশি হলে, এছাড়াও তাদের ১০০ ম্যানাসহ রিভাইভ করা উচিত।
প্লেয়ারের লেভেল ১০-এর নিচে হলে, তাদের ম্যানা অপরিবর্তিত রাখা উচিত।
revive ফাংশনটি প্লেয়ারের লেভেল অপরিবর্তিত রাখবে।
let dead_player = Player(name: None, level: 2, health: 0, mana: None)
revive(dead_player)
// -> Some(Player(name: None, level: 2, health: 100, mana: None))
যদি revive মেথডটি এমন কোনো প্লেয়ারের ওপর কল করা হয় যাদের হেলথ ১ বা তার বেশি, তবে ফাংশনটি None রিটার্ন করবে।
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
cast_spell ফাংশনটি আর্গুমেন্ট হিসেবে একটি Int নেয়, যা নির্দেশ করে স্পেলটির কত ম্যানা খরচ হয়, এবং এর সাথে একটি Player-ও নেয়।
এটি আপডেট হওয়া প্লেয়ার এবং কাস্ট করা স্পেল যে পরিমাণ ড্যামেজ করে, তা রিটার্ন করে।
সফলভাবে স্পেল কাস্ট করলে স্পেলটির ম্যানা খরচের দুই গুণের সমান ড্যামেজ হয়।
তবে, প্লেয়ারের কাছে যথেষ্ট ম্যানা না থাকলে কিছুই হয় না, প্লেয়ার অপরিবর্তিত থাকে এবং কোনো ড্যামেজ হয় না।
প্লেয়ারের যদি ম্যানা পুলই না থাকে, তবে স্পেল কাস্ট করার চেষ্টা করলে তাদের হেলথ স্পেলটির ম্যানা খরচের সমান কমিয়ে দেবে এবং কোনো ড্যামেজ করবে না।
মনে রাখবেন, প্লেয়ারদের হেলথ শূন্যের (০) নিচে হতে পারে না।
let wizard = Player(name: None, level: 18, health: 123, mana: Some(30))
let #(wizard, damage) = cast_spell(wizard, 14)
wizard.mana // -> Some 16
damage // -> 28
Exercism-এ সাইন আপ করুন, Gleam ট্র্যাকের 33টি কনসেপ্ট122টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।