在clojure中将字符串转换为关键字



假设我想将循环中的数字更改为关键字,以便检查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函数(将映射作为第一个参数!)。

上面的代码是基于这个模板项目的。

相关内容

最新更新