2015-10-12 25 views
1

拿到如果我有一个图是这样的:的Clojure:如何从一个地图使用字符串键

(def foo {:bar "foobar"}) 

而且我已经通过了关键:bar作为字符串(即":bar") 我想能够从地图上做一些访问值一样

(get foo (symbol ":bar")) 

我本以为这工作,因为(symbol ":bar"):bar ...但它只是返回nil

+0

应该不就是'(关键字 “栏” )'而不是? – cfrick

+0

好吧,(关键字“酒吧”)的作品......但我有'“:酒吧”'在字符串不''酒吧“' – stukennedy

回答

3

如果需要从字符串使“:ASD”关键字:asd你做这样的事情:

> (= (read-string ":asd") (keyword (subs ":asd" 1)) :asd) 
true 

您与(symbol ":asd")代码只打印自己喜欢:asd,但实际上是一个符号,而不是关键字。

+0

谢谢你...感觉有点哈克,但看起来这是唯一的方法。 – stukennedy

+1

这有点怪异,因为你有字符串'“:asd”'开头。那串来自哪里?更可能的是,通过首先生成更合理的字符串输入,您可以更接近其来源解决此问题。 – amalloy

+0

是的,我最终只是这样做了......我在存储之前使用了'(name“:asd”)'所以我可以在字符串上使用'(关键字“asd”)'。感谢您的建议。 – stukennedy

0

如果您的字符串确实是“:bar”,只需做一次替换即可删除冒号,然后使用keyword将其转换为关键字。

(def foo {:bar "foobar"})

(foo (keyword (clojure.string/replace ":bar" #"\:" ""))) => “foobar的”

0

这工作:

((read-string ":bar") {:bar "foobar"}) 
=> "foobar" 

当然还是:

(get {:bar "foobar"} (read-string ":bar")) 
相关问题