【问题标题】:Clojure: Getting single value and map in structmapClojure:在 structmap 中获取单个值和映射
【发布时间】:2010-10-01 08:01:47
【问题描述】:

我有一系列从其他地方得到的值,顺序是已知的。我也有一个单独的值。我想把这两个都放入一个结构中。即

(defstruct location :name :id :type :visited)

现在我有一个清单

(list "Name" "Id" "Type")

这是一个正则表达式的结果。

然后我想在 :visited; 中放入一个布尔值;产生一个看起来像这样的结构:

{:name "Name" :id "Id" :type "Type" :visited true}

我该怎么做?我尝试了 apply 和 struct-map 的各种组合。我做到了:

(apply struct-map location (zipmap [:visited :name :id :type] (cons true (rest match))))

但这可能是完全错误的方法。

【问题讨论】:

    标签: clojure clojureclr


    【解决方案1】:

    怎么样:

    (def l (list "Name" "Id" "Type"))
    (defstruct location :name :id :type :visited)
    (assoc
       (apply struct location l)
       :visited true)
    

    【讨论】:

      【解决方案2】:

      如果您在 1.2 中,则应该使用记录而不是结构。

      (defrecord location [name id type visited])
      
      (defn getLoc [[name type id] visited] (location. name id type visited))
      
      (getLoc (list "name" "type" "id") true)
      #:user.location{:name "name", :id "id", :type "type", :visited true}
      

      【讨论】:

      • +1 获取有关记录的提示。我不喜欢仅仅为了解构这种特殊情况而编写一个特殊的函数。谢谢!
      • 您不必这样做。如果您将数据作为列表获取,我会更好。
      【解决方案3】:

      您的版本看起来不错。通过into 的一个小捷径:

      user> (let [match (list "Name" "Id" "Type")]
              (into {:visited true} 
                    (zipmap [:name :id :type] match)))
      {:visited true, :type "Type", :id "Id", :name "Name"}
      

      merge 也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-02
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        相关资源
        最近更新 更多