3

部屋を番号で削除したい。ご覧のとおり、部屋は原子リストであり、原子が含まれています。例外が発生しました:IllegalArgumentException ISeqを作成する方法がわかりません:core.main $ delete_room_by_id $ fn__7541 clojure.lang.RT.seqFrom(RT.java:487)

私はこのコードを持っています:

(comment ------------- * DATA * ----------------- )
(def rooms "atomic list of atoms - rooms" (atom '()))

(comment ------------- * UTILS * ----------------- )

(defn enter-value [message]
     (do (println message) (read-line)))

(comment ------------- * ADD ROOM * ----------------- )

(defn save-room "The function that will save provided room." 
     [number num-of-beds price]
     (swap! rooms conj (atom {:number number 
                              :num-of-beds num-of-beds
                              :price price 
                              :is-ocupated false})))

(defn enter-room "This function will create room based on user input." []
     (let [number (enter-value "Number...")
           num-of-beds (enter-value "Number of beds...")
           price (enter-value "Price...")]
       (save-room number num-of-beds price)))

(comment ------------- * DELETE ROOM * ----------------- )

(defn delete-room-by-number "Delete room by number."
     [number]
     (swap! rooms remove #(not (= (:number @%) number))))

そのスワップだと思います!関数は私が望むように関数を削除するためのパラメータを入れません。最後のコマンドは:(部屋を削除する#(not(=(:number @%)number)))だと思います。@roomsのような部屋の参照を解除し、remove関数の2番目のパラメーターとして渡す必要があるため、これは適切ではありません。

これを読んでくれてありがとう。

4

1 に答える 1

7

2つの機能に誤りがあります。save-roomの値は、アトム内のマップではなく、単なるマップである必要があります。そうしないと、アトムがアトムに保存されるためです。また、部屋番号による削除に誤りがあり、無名関数が正しく記述されていませんでした。

(defn save-room "The function that will save provided room." 
           [number num-of-beds price]
           (swap! rooms conj {:number number :num-of-beds num-of-beds :price price :is-ocupated false}))

(defn delete-room-by-number [num]
     (swap! rooms #(remove (fn [room] (= (:number room) num)) %)))

アップデート:

不変の、場合によってはネストされたデータ構造をアトム/参照などに格納するのがより一般的な方法です。より良いオプションは、リストではなく、次のようなベクトルまたはマップを使用することです。

(def room-map {1 {:nums-of-beds 2 :price 30}, 2 {:nums-of-beds 4 :price 60}})

このようにして、部屋番号をキーとして使用します。この方法では、マップキーは一意である必要があるため、部屋番号が重複することはありません。

あなたはassoc-in、update-inなどで地図を更新することができます:

(def new-room-map (assoc-in room-map [2 :nums-of-beds] 40))

new-room-mapの価値:{1 {:nums-of-beds 2, :price 30}, 2 {:nums-of-beds 40, :price 60}}

部屋の地図表現を行う場合は、関数assoc-inをswapと組み合わせて使用​​してください。ルームマップの更新バージョンがアトムに保存されます。これを理解するのに問題がある場合は、これらの関数について詳しく読むことをお勧めします。

http://clojuredocs.org/clojure_core/clojure.core/swaphttp://clojuredocs.org/clojure_core/clojure.core/assoc-in

于 2012-12-15T08:42:35.177 に答える