假设我想将循环中的数字更改为关键字,以便检查dict/map中的条目:
(def myarray {:p1 "test"})
#'user/myarray
user> (get myarray
(keyword ":p1")
)
nil
user> (get myarray
(symbol ":p1")
)
nil
user>
我只是得到nil返回。我错过了什么?
:是Clojure指南中关键字的指示符,关键字函数根据Clojure Docs自动添加:。所以正确的代码必须是(keyword "p1")而不是(keyword ":p1")
你可以这样做:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test))
(dotest
(let [m1 {:p1 "a"
:p2 "b"}
k1 (keyword (str "p" 1))
k2 (keyword (str "p" 2))
v1 (k1 m1)
v2 (k2 m1)]
(is= [k1 k2] [:p1 :p2])
(is= [v1 v2] ["a" "b"])))
请注意,整数是一个完全有效的映射键:
(dotest
(let [m1 {1 "a"
2 "b"}
k1 1
k2 2
v1 (get m1 k1) ; this doesn't work: (k1 m1 )
v2 (get m1 k2)]
(is= [k1 k2] [1 2])
(is= [v1 v2] ["a" "b"])))
您只需要使用get
函数(将映射作为第一个参数!)。
上面的代码是基于这个模板项目的。