2010-09-30 34 views
3

我有一系列值,我從別的地方按照已知的順序獲得。我也有一個單獨的價值。這兩個我想放入一個結構。即Clojure:在structmap中獲取單值和映射

(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)))) 

但這可能是完全去解決它的錯誤方式。

回答

3

如何:

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

是的......這麼容易:) – 2010-10-01 20:53:27

0

您的版本看起來不錯。通過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也會工作。

3

,如果你是在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} 
+0

+1爲關於記錄的提示。我不喜歡爲了解構這個特殊情況而寫一個特殊的函數。謝謝! – 2010-10-01 20:52:56

+0

你不需要。如果你把數據作爲一個列表,我會更好。 – nickik 2010-10-02 11:20:16