【问题标题】:* regular expression operator in clojure.spec* clojure.spec 中的正则表达式运算符
【发布时间】:2019-04-08 06:11:11
【问题描述】:

根据Spec Guide

* 正则表达式运算符:检查 0 个或多个谓词/模式,如下所示:

(s/def ::seq-of-keywords (s/* keyword?))

;; opts are alternating keywords and booleans
(s/def ::opts (s/* (s/cat :opt keyword? :val boolean?)))
(s/conform ::opts [:silent? false :verbose true])
;;=> [{:opt :silent?, :val false} {:opt :verbose, :val true}]

但据我了解,s/cat 检查一个序列。

那么为什么(s/* (s/cat)) 不用于检查每个都符合(s/cat) 的序列。

类似这样的:

(s/conform ::opts [[:silent? false] [:verbose true]])

为什么它表现得像s/* flattened s/cat?或者如何检查[[:silent? false] [:verbose true]] 之类的内容?

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    您可以使用coll-of

    (s/conform (s/coll-of ::opts) [[:silent? false] [:verbose true]])
    => [[{:opt :silent?, :val false}] [{:opt :verbose, :val true}]]
    

    有时它有助于生成示例数据:

    (gen/generate (s/gen ::opts))
    => (:aqfR6b*C/.  false  :?.03/Vu7?  false  :Y17UL0/McsI5h  true)
    

    [[:silent? false] [:verbose true]]的模式不匹配

    但是这个应该更接近你正在寻找的东西:

    (gen/generate (s/gen (s/coll-of (s/tuple keyword? boolean?))))
    => [[:X_o.u?7i/o.dIgTy false]  [:L?*/_WY._:z true]  [:X26:-j/l2q!u-7I false]]
    

    【讨论】:

      【解决方案2】:

      为什么...s/* 会压扁s/cat

      ... 因为正则表达式是 flat 序列的 结构化 规范。套用the Spec Guide to Sequences ...

      • 当组合正则表达式操作时,它们描述一个序列。
      • 要指定嵌套序列,请将其包装在对 s/spec 的显式调用中。

      如何指定[[:silent? false] [:verbose true]] 之类的内容?

      指定对的序列,每个对都是一个关键字,后跟一个布尔值:

      (s/def ::opts (s/* (s/spec (s/cat :opt keyword? :val boolean?))))
      

      注意s/spec 包裹s/cat。现在,例如,...

      => (s/conform ::opts [[:silent? false] [:verbose true]])
      [{:opt :silent?, :val false} {:opt :verbose, :val true}]
      

      当然,您可以像akond 那样使用

      • s/tuple 而不是 s/catand
      • s/coll-of 而不是 s/*

      不需要插入的s/spec

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 2013-10-26
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-07
        相关资源
        最近更新 更多