3

言語に関する非常に限られた知識に基づいて、最初のClojure関数を作成しました。パフォーマンスとタイプの使用に関するフィードバックをお待ちしています。たとえば、リストとベクターのどちらを使用すべきかわかりません。

(defn actor-ids-for-subject-id [subject-id]
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/with-query-results results
      ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id]
      (let [res (into [] results)]
        (map (fn [row] (get row :actor_id)) res)))))

次のテストに合格します(適切なシードデータが与えられた場合)。

(deftest test-actor-ids-for-subject-id
  (is (= ["123" "321"] (actor-ids-for-subject-id "123"))))

それが違いを生む場合(そして私が想像する場合)、返されるデータの私の使用特性は、ほとんど排他的に、同じ関数によって返される別のセットの和集合と共通部分を生成することを含みます。

4

2 に答える 2

4

初期ベクトルが空の場合、'into' の代わりに 'vec' を使用する方が少し簡潔です。好みの問題ではありますが、意図をより明確に表現することができます。

(vec (map :actor_id results))
于 2012-07-12T06:24:05.400 に答える
2

これresultsは でありclojure.lang.Cons、遅延シーケンスであり、 によって返されclojure.java.jdbc/resultset-seqます。各レコードは次のmapとおりです。

(defn actor-ids-for-subject-id [subject-id]
  (sql/with-connection (System/getenv "DATABASE_URL")
    (sql/with-query-results results
      ["SELECT actor_id FROM entries WHERE subject_id = ?" subject-id]
      (into [] (map :actor_id results)))))
于 2012-07-12T01:48:37.480 に答える