4

ベクター マップにオブジェクトを追加する方法を見つけようとしています。

(defstruct item :name)
(def itemList [])

(defn add-item [db & item] 
  (into db item))

(defn get-records[]
  (doseq [i (range 0 10 1)]  
   (add-records itemList  (struct item "test")
  ))

ループの最後に、10 個のオブジェクトを含めたいと考えitemListています。どんな助けでも非常に感謝します

4

2 に答える 2

4

Clojure は関数型プログラミング言語であり、その主なデータ構造はすべて不変で永続的です。これにはベクターも含まれます。

あなたの例では、状態を管理する必要があります。Clojure はこれに対していくつかの抽象化を提供しますが、その中でアトムがユースケースに最も適していると思います。

user=> (defrecord Item [name])
user.Item

user=> (def item-list (atom []))
#'user/item-list

user=> (defn add-item [db i] (swap! db #(conj % i)))
#'user/add-item

user=> (defn put-records [] 
         (doseq [i (range 10)] 
           (add-item item-list (Item. "test"))))
#'user/put-records

user=> (put-records)
nil

user=> item-list
#<Atom@4204: [#user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"} #user.Item{:name "test"}]>
于 2012-06-03T08:51:07.687 に答える
3

あなたが本当に何かを変異させる必要がある場合、missingfaktorの答えは正しいですが、持っている方がはるかに普通です:

(defstruct item :name)
(def itemList (for [i (range 10)] (struct item "test")))

つまり、コンテンツを含むオブジェクトのリストを作成します。

于 2012-06-03T12:23:09.157 に答える