【问题标题】:Clojure: how to get from a map using a string keyClojure:如何使用字符串键从地图中获取
【发布时间】:2015-10-12 15:22:04
【问题描述】:

如果我有这样的地图:

(def foo {:bar "foobar"})

我已将密钥 :bar 作为字符串传递(即 ":bar") 我希望能够访问地图中的值,例如

(get foo (symbol ":bar"))

我认为这会起作用,因为 (symbol ":bar"):bar ...但它只返回 nil

【问题讨论】:

  • 不应该是(keyword "bar")吗?
  • 嗯,是的,(关键字“bar”)有效......但我在字符串中有":bar"而不是"bar"

标签: dictionary clojure key clojurescript


【解决方案1】:

如果您需要从字符串 ":asd" 中创建关键字 :asd,请执行以下操作:

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

带有(symbol ":asd") 的代码只是像:asd 一样打印自己,但实际上是一个符号,而不是关键字。

【讨论】:

  • 谢谢你……先搞定字符串感觉有点笨拙,但看起来这是唯一的方法。
  • 有点hacky,因为你有字符串":asd"开头。那根弦是从哪里来的?更有可能的是,您可以通过首先生成更合理的字符串输入来更接近问题的根源。
  • 是的,我最终这样做了......我在存储之前使用了(name ":asd")......所以我可以在字符串上使用(keyword "asd")。感谢您的建议。
【解决方案2】:

如果你的字符串确实是":bar",只需替换掉冒号,然后使用keyword 将其转换为关键字。

(def foo {:bar "foobar"})

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

【讨论】:

    【解决方案3】:

    这行得通:

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

    当然也可以:

    (get {:bar "foobar"} (read-string ":bar"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-15
      • 2014-03-13
      • 1970-01-01
      • 2012-08-28
      • 2017-08-30
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多