شرح Clojure Hashmaps: كيفية استرداد القيم من وتحديث Hashmaps
الهاشمب هو مجموعة تعين المفاتيح للقيم. لديهم أسماء مختلفة في لغات أخرى - تشير Python إليها على أنها قواميس ، وكائنات JavaScript تعمل بشكل أساسي مثل hashmaps.
يمكن إنشاء الهاشمب ، مثل العديد من المجموعات ، بطريقتين. هناك وظيفة منشئ:
;; Note that each argument is *prepended* to the hashmap, not appended. (def a-hashmap (hash-map :a 1 :b 2 :c 3)) a-hashmap ; => {:c 3, :b 2, :a 1}
يمكنك أيضًا تعريفها باستخدام علامة التجزئة الحرفية. غالبًا ما يكون هذا أكثر إيجازًا ووضوحًا. يوصى باستخدام الفواصل لفصل أزواج المفاتيح / القيم في مخططات التجزئة ، حيث يمكن أن تجعل الحدود أكثر وضوحًا.
;; This hashmap is actually in the right order, unlike the one above. (def another-hashmap {:a 1, :b 2, :c 3}) another-hashmap ; => {:a 1, :b 2, :c 3}
متى تستخدم الهاشمب؟
تعد hashmap مفيدة عندما تريد إعطاء أسماء للمتغيرات الخاصة بك. إذا كنت تفكر في نفسك يومًا ، "ماذا لو استخدمت شيئًا ..." قبل أن تخرج منه وتدرك أنك تستخدم Clojure ، فحاول استخدام علامة التجزئة.
وهي مفيدة أيضًا إذا كنت تريد ربط قيمتين مختلفتين ببعضهما البعض. خذ على سبيل المثال، والشفرات ROT13 - هل يمكن ربط \A
مع \N
، \B
مع \M
، وهلم جرا.
قد يكون هذا طويلًا ومملًا للكتابة بمعظم اللغات ، لكن لكلوجور بعض الوظائف التي يمكن أن تنشئها لك وتجعلها ممتعة!
الكلمات الرئيسية واسترجاع القيم من hashmaps
أصمد. ما هذا؟ :a
؟ :b
؟ :c
؟ هذه تبدو غريبة. تلك ، كما ترى ، هي كلمات رئيسية. يطلق عليها كلمات رئيسية لأنها تستخدم غالبًا كمفاتيح في hashmaps.
لماذا غالبا ما تستخدم كمفاتيح؟ حسنًا ، على عكس السلاسل ، يمكن استخدام الكلمات الرئيسية كوظائف لاستخراج القيم من الهاشمب ؛ لا حاجة ل get
أو nth
!
(def string-hashmap {"a" 1, "b" 2, "c" 3}) ("a" string-hashmap) ; => ClassCastException java.lang.String cannot be cast to clojure.lang.IFn (def keyword-hashmap {:a 1, :b 2, :c 3}) (:a keyword-hashmap) ; => 1 ;; You can also pass a keyword a default value in case it's not found, just like get. (:not-in-the-hashmap keyword-hashmap "not found!") ; => "not found!"
قم بتحديث الهاشمب
يمكنك تحديث القيم داخل hashmap باستخدام assoc
. هذا يسمح لك بإلحاق أزواج مفتاح / قيمة جديدة أو تغيير الأزواج القديمة.
(def outdated-hashmap {:a 1, :b 2, :c 3}) (def newer-hashmap (assoc outdated-hashmap :d 4)) newer-hashmap ; => {:a 1, :b 2, :c 3, :d 4} (def newest-hashmap (assoc newer-hashmap :a 22)) newest-hashmap ; => {:a 22, :b 2, :c 3, :d 4} ;; Note that outdated-hashmap has not been mutated by any of this. ;; Assoc is pure and functional. outdated-hashmap ; => {:a 1, :b 2, :c 3}
تحويل المجموعات الأخرى إلى hashmaps
التحويل إلى الهاشمب صعب. للتوضيح ، دعنا نحاول استخدامه مثل vec
أو seq
.
(hash-map [:a 1 :b 2 :c 3]) ; => IllegalArgumentException No value supplied for key: [:a 1 :b 2 :c 3]
و hash-map
تعتقد وظيفة أن نحاول خلق hashmap مع [:a 1 :b 2 :c 3]
واحدة من المفاتيح. شاهد ما يحدث إذا قدمنا العدد الصحيح من الحجج:
(hash-map [:a 1 :b 2 :c 3] "foo") ; => {[:a 1 :b 2 :c 3] "foo"}
لتحويل تسلسل إلى علامة التجزئة ، ستحتاج إلى استخدام وفهم apply
. لحسن الحظ ، هذا بسيط جدًا: apply
يدمر مجموعة قبل تطبيق وظيفة عليها.
;; These two expressions are exactly the same. (+ 1 2 3) ; => 6 (apply + [1 2 3]) ; => 6
هذه هي الطريقة التي ستحول بها المتجه إلى علامة التجزئة:
(apply hash-map [:a 1 :b 2 :c 3]) ; => {:c 3, :b 2, :a 1} ;; This is the same as: (hash-map :a 1 :b 2 :c 3) ; => {:c 3, :b 2, :a 1}
يجب أن يكون هذا كل ما تحتاجه لبدء استخدام hashmaps في Clojure. اخرج الآن وابدأ التجزئة مع أفضل ما لديهم.