Elixir ফাংশনকে একাধিক ক্লজ রাখার সুযোগ দিয়ে Open-Closed Principle অনুশীলন সহজ করে তোলে। ফলে বিশাল ও হার্ডকোড করা কন্ট্রোল-লজিক ছড়িয়ে না দিয়ে বরং নির্দিষ্ট ফাংশন লিখে সহজেই আচরণ যোগ বা বাদ দেওয়া যায়।
লেখার জন্য Elixir দেয় একাধিক ফাংশন ক্লজ ও গার্ড:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
রানটাইমে Elixir সোর্স ফাইলের উপর থেকে নিচে পরীক্ষা করে দেখে কোন ফাংশন ক্লজটি কল করবে।
যে ভ্যারিয়েবলগুলো ব্যবহার করা হয় না, সেগুলোর আগে একটি আন্ডারস্কোর বসানো উচিত।
গার্ড ফাংশন দিয়ে আর্গুমেন্ট মূল্যায়নের ভিত্তিতে Elixir যেন ফাংশন কল না করে, সেজন্য গার্ড ব্যবহার করা হয়। গার্ড শুরু হয় when কিওয়ার্ড দিয়ে, তারপর আসে একটি বুলিয়ান এক্সপ্রেশন। গার্ড ফাংশন হলো বিশেষ ধরনের ফাংশন, যেগুলো:
true বা false মান রিটার্ন করতে হবে।কমন গার্ডের একটি তালিকা Elixir ডকুমেন্টেশন-এ পাওয়া যায়। এতে রয়েছে টাইপ চেক, মৌলিক পাটিগণিত, তুলনা এবং কঠোরভাবে বুলিয়ান অপারেটর।
ফাংশন এক বা একাধিক আর্গুমেন্টের জন্য ডিফল্ট মান ঘোষণা করতে পারে। চলুন এই ফাংশনটি দেখি:
def number(n \\ 13), do: "That's not my favorite"
কম্পাইল হলে Elixir number/0 (কোনো আর্গুমেন্ট নেই) এবং number/1 (একটি আর্গুমেন্ট) নামে একটি ফাংশন ডেফিনিশন তৈরি করে।
যদি একাধিক আর্গুমেন্টের ডিফল্ট মান থাকে, তাহলে অনুপস্থিত আর্গুমেন্ট পূরণ করতে বাম থেকে ডানে ফাংশনে ডিফল্ট মানগুলো প্রয়োগ করা হয়।
ফাংশনে একাধিক ক্লজ থাকলে, ফাংশন ক্লজগুলোর আগে একটি ফাংশন হেডারে (বডি ছাড়া ফাংশন) ডিফল্ট আর্গুমেন্ট ডিফাইন করা উচিত:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
আপনি একটি সহজ অনলাইন গেম তৈরি করছেন, যেখানে একজন বন্ধু একটি গোপন সংখ্যা অনুমান করতে পারবে। আপনি কিছু প্রতিক্রিয়া দিতে চান, কিন্তু একটি অনুমানের মাধ্যমে উত্তরটি ফাঁস করতে চান না। অনুমানটি গোপন সংখ্যার সাথে কীভাবে সম্পর্কিত, তার উপর নির্ভর করে ভিন্ন ভিন্ন প্রতিক্রিয়া দেওয়ার জন্য আপনাকে একটি ফাংশন বানাতে হবে।
| শর্ত | প্রতিক্রিয়া |
|---|---|
| যখন অনুমানটি গোপন সংখ্যার সাথে মিলে যায় | "Correct" |
| যখন অনুমানটি গোপন সংখ্যার চেয়ে এক বেশি বা এক কম হয় | "So close" |
| যখন অনুমানটি গোপন সংখ্যার চেয়ে বড় হয় | "Too high" |
| যখন অনুমানটি গোপন সংখ্যার চেয়ে ছোট হয় | "Too low" |
| যখন কোনো অনুমান করা হয় না | "Make a guess" |
সব অনুমান ও গোপন সংখ্যাই ইন্টিজার সংখ্যা।
compare/2 ফাংশনটি ইমপ্লিমেন্ট করুন, যা দুটি আর্গুমেন্ট নেয়: secret_number এবং guess, যেগুলো দুটোই ইন্টিজার।
GuessingGame.compare(5, 5)
# => "Correct"
compare ফাংশনটি পরিবর্তন করুন, যাতে এটি গোপন সংখ্যার চেয়ে বড় অনুমানগুলোর প্রতিক্রিয়া দিতে পারে।
GuessingGame.compare(5, 8)
# => "Too high"
compare ফাংশনটি পরিবর্তন করুন, যাতে এটি গোপন সংখ্যার চেয়ে ছোট অনুমানগুলোর প্রতিক্রিয়া দিতে পারে।
GuessingGame.compare(5, 2)
# => "Too low"
compare ফাংশনটি পরিবর্তন করুন, যাতে এটি গোপন সংখ্যার কাছাকাছি অনুমানগুলোর প্রতিক্রিয়া দিতে পারে।
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
compare ফাংশনটি পরিবর্তন করুন, যাতে কোনো অনুমান না থাকলেও এটি প্রতিক্রিয়া দিতে পারে।
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।