0

私は次の構造を持っています:

(defrecord Member [id name salary role])  
(defrecord Project [id name duration])
(defrecord ProjectMember [project member])

(def project-member-records (ref ()))

(defn find-project-member-record [parm-proj-id parm-member-id]
  (filter #(let [project (.project %) 
             member (.member %) 
             proj-id (:id project)
             member-id (:id member)] 
             (and (= proj-id parm-proj-id)
                  (= member-id parm-member-id))) @project-member-records))

;;Sample func, does not work
(defn remove-project-member-record [proj-id member-id]
  (dosync (ref-set project-member-records (remove #(= (:id (.project %)) proj-id) @project-member-records))))

今、私は からアイテムを削除したいと思いますproject-member-records。たとえば、find-project-member-record関数内のレコードを検索するように、プロジェクト ID とメンバー ID で項目を削除したいとします。または (および) によって見つかったレコードよりも項目を削除したいproject-member-records、のようなものです(remove (find-project-member-record 1 1) project-records) ;pseudo codeが、これを行う方法がわかりません。

4

1 に答える 1

1

使用removeは正しいですがfind-project-member-record、シーケンスを返します。試す

(defn remove-project-member-record [proj-id member-id]
  (let [it (first (find-project-member-record proj-id member-id))]
    (dosync
     (ref-set project-member-records
              (remove #(= % it) @project-member-records)))))

find-project-member-record常に空のシーケンスまたは 1 つのアイテムを含むシーケンスのいずれかを返す場合、代わりにアイテム自体または のいずれかを返すことが理にかなっている場合がありますnil。(たとえば、in と他の場所ではなく、inのfirst結果を呼び出します)。filterfind-project-member-recordremove-project-member-record

dosyncすべてをトランザクションにラップする場合は、次のように構造化できます。

(defn remove-project-member-record [proj-id member-id]
  (dosync
   (let [it (first (find-project-member-record proj-id member-id))]
     (ref-set project-member-records
              (remove #(= % it) @project-member-records)))))
于 2013-09-23T13:15:23.987 に答える