Clojure:如何使用字符串键从地图中获取
Clojure: how to get from a map using a string key
如果我有这样的地图:
(def foo {:bar "foobar"})
并且我已经将密钥 :bar
作为字符串传递给了我(即 ":bar"
)
我希望能够通过类似
的操作从地图访问值
(get foo (symbol ":bar"))
我认为可行,因为 (symbol ":bar")
是 :bar
... 但它只是 returns nil
如果您需要从字符串“:asd”中创建关键字:asd
,您可以这样做:
> (= (read-string ":asd") (keyword (subs ":asd" 1)) :asd)
true
带有 (symbol ":asd")
的代码只是像 :asd
一样打印自己,但实际上是一个符号,而不是关键字。
如果您的字符串确实是“:bar”,只需进行替换以删除冒号,然后使用 keyword
将其转换为关键字。
(def foo {:bar "foobar"})
(foo (keyword (clojure.string/replace ":bar" #"\:" "")))
=> "foobar"
这个有效:
((read-string ":bar") {:bar "foobar"})
=> "foobar"
或者当然:
(get {:bar "foobar"} (read-string ":bar"))
如果我有这样的地图:
(def foo {:bar "foobar"})
并且我已经将密钥 :bar
作为字符串传递给了我(即 ":bar"
)
我希望能够通过类似
(get foo (symbol ":bar"))
我认为可行,因为 (symbol ":bar")
是 :bar
... 但它只是 returns nil
如果您需要从字符串“:asd”中创建关键字:asd
,您可以这样做:
> (= (read-string ":asd") (keyword (subs ":asd" 1)) :asd)
true
带有 (symbol ":asd")
的代码只是像 :asd
一样打印自己,但实际上是一个符号,而不是关键字。
如果您的字符串确实是“:bar”,只需进行替换以删除冒号,然后使用 keyword
将其转换为关键字。
(def foo {:bar "foobar"})
(foo (keyword (clojure.string/replace ":bar" #"\:" "")))
=> "foobar"
这个有效:
((read-string ":bar") {:bar "foobar"})
=> "foobar"
或者当然:
(get {:bar "foobar"} (read-string ":bar"))