小编Dan*_*ero的帖子

用于检查地图上的某个键是否具有值的惯用方法

检查地图上的某个键是否有值的惯用方法是什么?例如,如果我们有:

=> (def seq-of-maps [{:foo 1 :bar "hi"} {:foo 0 :bar "baz"}])
Run Code Online (Sandbox Code Playgroud)

要查找所有地图:foo == 0,我喜欢:

=> (filter (comp zero? :foo) seq-of-maps)
({:foo 0, :bar "baz"})
Run Code Online (Sandbox Code Playgroud)

但如果我想找到所有的地图:bar =="hi",我能想到的最好的是:

=> (filter #(= (:bar %) "hi") seq-of-maps)
({:foo 1, :bar "hi"})
Run Code Online (Sandbox Code Playgroud)

我发现它不太可读.这样做有更好/更惯用的方式吗?

clojure

13
推荐指数
2
解决办法
3686
查看次数

clojure的Schema中至少有一个可选键

假设我从外部世界收到一些输入,我有以下架构:

(def my-schema
  {(s/optional-key :foo) Bool
   (s/optional-key :baz) Bool
   (s/optional-key :bar) Bool})
Run Code Online (Sandbox Code Playgroud)

有了上述内容,我正在验证的地图中可能存在或缺少所有键或没有键,这是有道理的.但是,如果我想确保其中至少有一个存在,该怎么办?

在Schema验证了上述内容后,我当然可以执行额外的单独检查,并确保密钥计数> = 1,但我很好奇是否有一种方法可以在Schema定义中强制执行.

思考?

validation schema input clojure

6
推荐指数
1
解决办法
633
查看次数

当类实现多个接口时,Clojure协议调用的解析

给定Clojure中的set,map和vector实现IPersistentCollection和IFn,Clojure如何决定使用SayHi的哪个实现:

(defprotocol SayHi
  (hi [this]))

(extend-protocol SayHi
  clojure.lang.IPersistentCollection
  (hi [_] (println "Hi from collection"))
  clojure.lang.IFn
  (hi [_] (println "Hi from Fn!"))
  clojure.lang.IPersistentSet
  (hi [_] (println "Hi from set!")))

(hi #{})
Hi from set!
(hi [])
Hi from collection
Run Code Online (Sandbox Code Playgroud)

clojure

5
推荐指数
1
解决办法
277
查看次数

使用"休息"时保持序列的头部

我正在解析一个大的csv文件,我使用它的第一行作为记录的键.所以对于像以下的csv文件:

header1,header2
foo,bar
zoo,zip
Run Code Online (Sandbox Code Playgroud)

我最终得到了一个懒惰的seq:

({:header1 "foo" :header2 "bar"},
 {:header1 "zoo" :header2 "zip"})
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但我不确定在以下函数中我是否持有"行"的头部.

(defn csv-as-seq [file]
  (let [rdr (clojure.java.io/reader file)]
    (let [lines (line-seq rdr)
         headers (parse-headers (first lines))]
      (map (row-mapper headers) (rest lines)))))
Run Code Online (Sandbox Code Playgroud)

有人可以澄清一下吗?

clojure

3
推荐指数
1
解决办法
430
查看次数

标签 统计

clojure ×4

input ×1

schema ×1

validation ×1