Elixir-এ ম্যাপ হলো কী (key)-ভ্যালু জোড়ায় তথ্য জমা রাখার ডেটা স্ট্রাকচার। অন্য ভাষায় এগুলোকে অ্যাসোসিয়েটিভ অ্যারে (PHP), হ্যাশ (Perl 5, Raku) বা ডিকশনারি (Python) নামেও চেনা হয়।
কী (key) আর ভ্যালু যেকোনো ডেটা টাইপের হতে পারে, তবে কী (key) যদি অ্যাটম হয়, তাহলে আমরা একটি শর্টহ্যান্ড সিনট্যাক্স ব্যবহার করতে পারি। অ্যাক্সেস বা রিটার্ন করার সময় ম্যাপ তার এন্ট্রিগুলোর ক্রম নিশ্চিত করে না।
একটি ফাঁকা ম্যাপ ঘোষণা করা হয় শুধু %{} দিয়ে। একটি ম্যাপ লিটারালে আইটেম যোগ করতে চাইলে আমরা দুটি রূপ ব্যবহার করতে পারি:
# If the key is an atom:
%{atom_key: 1}
# If the key is a different type:
%{1 => :atom_value}
# You can even mix these if the atom form comes second:
%{"first_form" => :a, atom_form: :b}
কোনো একক ক্যানোনিকাল ফরম্যাট না থাকলেও, কী (key)-ভ্যালু লিটারাল জোড়াগুলো প্রকাশের জন্য একটি সামঞ্জস্যপূর্ণ উপায় বেছে নিন।
Elixir ম্যাপ নিয়ে কাজ করার জন্য Map মডিউলে অনেক ফাংশন দেয়। Map মডিউলের কিছু ফাংশনে ম্যাপের রূপান্তরে সাহায্য করার জন্য ফাংশনের ভেতরে একটি অ্যানোনিমাস ফাংশন পাস করতে হয়।
Elixir-এ আমরা মডিউল অ্যাট্রিবিউট ডিফাইন করতে পারি, যেগুলো আমাদের ফাংশনে কনস্ট্যান্ট হিসেবে ব্যবহার করা যায়।
defmodule Example do
# Defines the attribute as the value 1
@constant_number 1
def example_value() do
# Returns the value 1
@constant_number
end
end
মডিউল কনস্ট্যান্ট ডিফাইন করতে ব্যবহার করা হলে অ্যাট্রিবিউট যেকোনো এক্সপ্রেশন হতে পারে, যা কম্পাইলেশনের সময় ইভ্যালুয়েট করা যায়। কম্পাইলেশনের পরে অবশ্য মডিউল অ্যাট্রিবিউট আর অ্যাক্সেস করা যায় না, কারণ কম্পাইলের সময়ই সেগুলো এক্সপ্যান্ড হয়ে যায়, অনেকটা C-এর মতো ভাষায় ডিফাইন করা ম্যাক্রোর মতো।
এই অনুশীলনীতে, আপনি আপনার স্থানীয় আর্কেড হলের সবচেয়ে জনপ্রিয় গেমের হাই স্কোর হিসাব রাখার একটি উপায় তৈরি করছেন।
নতুন একটি হাই স্কোর ম্যাপ তৈরি করতে, HighScore.new/0 ফাংশনটি ডিফাইন করুন, যা কোনো আর্গুমেন্ট নেয় না এবং হাই স্কোরের একটি নতুন, খালি ম্যাপ রিটার্ন করে।
HighScore.new()
# => %{}
হাই স্কোর ম্যাপে একজন প্লেয়ার যোগ করতে, HighScore.add_player/3 ডিফাইন করুন, যা তিনটি আর্গুমেন্ট নেয় এমন একটি ফাংশন:
ডিফল্ট প্রাথমিক স্কোরটি একটি মডিউল অ্যাট্রিবিউটে সংরক্ষণ করুন। এটি আবার দরকার হবে।
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 0, "José Valim"=> 486_373}
হাই স্কোর ম্যাপ থেকে একজন প্লেয়ার সরাতে, HighScore.remove_player/2 ডিফাইন করুন, যা দুটি আর্গুমেন্ট নেয়:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas")
# => %{"Dave Thomas" => 0}
score_map = HighScore.remove_player(score_map, "Dave Thomas")
# => %{}
একজন প্লেয়ারের স্কোর রিসেট করতে, HighScore.reset_score/2 ডিফাইন করুন, যা দুটি আর্গুমেন্ট নেয়:
প্লেয়ারের কোনো স্কোর না থাকলেও ফাংশনটি কাজ করা উচিত।
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.reset_score(score_map, "José Valim")
# => %{"José Valim"=> 0}
আগের স্কোরের সাথে যোগ করে একজন প্লেয়ারের স্কোর আপডেট করতে, HighScore.update_score/3 ডিফাইন করুন, যা তিনটি আর্গুমেন্ট নেয়:
প্লেয়ারের আগের কোনো স্কোর না থাকলেও ফাংশনটি কাজ করা উচিত। ধরে নিন আগের স্কোরটি 0।
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"José Valim"=> 486_373}
score_map = HighScore.update_score(score_map, "José Valim", 5)
# => %{"José Valim"=> 486_378}
প্লেয়ারদের একটি অ্যারে পেতে, HighScore.get_players/1 ডিফাইন করুন, যা একটি আর্গুমেন্ট নেয়:
score_map = HighScore.new()
# => %{}
score_map = HighScore.add_player(score_map, "Dave Thomas", 2_374)
# => %{"Dave Thomas" => 2_374}
score_map = HighScore.add_player(score_map, "José Valim", 486_373)
# => %{"Dave Thomas" => 2_374, "José Valim"=> 486_373}
HighScore.get_players(score_map)
# => ["Dave Thomas", "José Valim"]
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।