2015-10-12 55 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")) 
相關問題