الخرائط في Elixir هي بنية البيانات المخصصة لتخزين المعلومات في أزواج من المفتاح والقيمة. وفي لغات أخرى، قد تُعرف هذه أيضًا باسم المصفوفات الترابطية (PHP)، أو الهاشات (Perl 5، Raku)، أو القواميس (Python).
يمكن أن تكون المفاتيح والقيم من أي نوع بيانات، لكن إذا كان المفتاح ذرة يمكننا استخدام صيغة مختصرة. ولا تضمن الخرائط ترتيب عناصرها عند الوصول إليها أو إرجاعها.
تُعرَّف الخريطة الفارغة ببساطة بالصيغة %{}. وإذا أردنا إضافة عناصر إلى خريطة حرفية، يمكننا استخدام صيغتين:
# 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}
ورغم أنه لا توجد صيغة قياسية، اختر أسلوبًا متسقًا لتمثيل أزواج المفتاح والقيمة الحرفية.
توفر 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، وهي دالة تأخذ 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، التي تأخذ 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.