【问题标题】:Can one make a predicate function from a Plumatic Schema?可以从 Plumatic Sc​​hema 中创建一个谓词函数吗?
【发布时间】:2017-09-25 07:12:23
【问题描述】:

我想创建一个谓词函数,当匹配模式 X 时返回 true,否则返回 false。

【问题讨论】:

    标签: clojure plumatic-schema


    【解决方案1】:

    您可以使用schema/check,其工作方式类似于schema/validate,但直接将错误作为值返回,而不是抛出异常或nil,如果没有发现错误:

    (schema/defschema string-vector
      [schema/Str])
    
    (defn str-vec? [arg]
      (nil? (schema/check string-vector arg)))
    
    (str-vec? ["hi"])   ; => true
    (str-vec? ["hi" 5]) ; => false
    

    还有schema/checker“为模式编译一个高效的检查器”:

    (let [str-vec?-checker (schema/checker string-vector)]
      (defn str-vec? [arg]
        (nil? (str-vec?-checker arg))))
    

    【讨论】:

      【解决方案2】:

      也许不是最漂亮的解决方案,但我们可以使用架构 validate 并捕获它在失败时引发的异常。

      (schema/defschema string-vector
        [schema/Str])
      
      (defn str-vec? [arg]
        (try (schema/validate string-vector arg)
             true
             (catch clojure.lang.ExceptionInfo e
               false)))
      
      (str-vec? ["hi"])   ; => true
      (str-vec? ["hi" 5]) ; => false
      

      希望其他人可以提供更好的解决方案。

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 2016-07-16
        • 2016-09-28
        • 2017-09-26
        • 2017-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        相关资源
        最近更新 更多