我经常需要一个可以验证非空白字符串的规范
`
(s/def ::non-blank-string (complement str/blank?))
(s/valid? ::non-blank-string "foo")
;; => true
`
它对非字符串值抛出异常,并且没有生成器
`
(s/exercise ::non-blank-string)
;; => 未处理的 clojure.lang.ExceptionInfo...
(s/valid? ::non-blank-string 42)
;; => 未处理的 java.lang.ClassCastException...
`
可以用以下方法解决
`
(s/def ::non-blank-string (s/and string? (complement str/blank?)))
(s/exercise ::non-blank-string)
;; => (["8" "8"] ["pS" "pS"] ["RL" "RL"] ["3" "3"] ["c2ZUx" "c2ZUx"] ["24VF" "24VF"] ["0wc80" "0wc80"] ["Wr49vz" "Wr49vz"] ["1UDte" "1UDte"] ["2f" "2f"])
(s/valid? ::non-blank-string 42)
;; => false
`
问题:这个规范里的需求似乎是个反复出现的常见问题,我不断地重新实现它。有时我会将其命名为 ::non-empty-string,或者创建一个包含该规范的独立命名空间,以便能够重用它。
解决方案:将其做成标准谓词。可能可以将其命名为 text?。