当前位置: 首页 > 知识库问答 >
问题:

clojure.spec中的禁用键

马博学
2023-03-14

我正在遵循Clojure.spec指南。我理解在使用clojure.spec/keys时声明必需和可选属性是可能的。

我不明白可有可无是什么意思。对我来说:OPT什么都不做。

(s/valid? (s/keys :req [:my/a]) {:my/a 1 :my/b 2}) ;=> true

(s/valid? (s/keys :req [:my/a] :opt []) {:my/a 1 :my/b 2}) ;=> true

共有1个答案

阎作人
2023-03-14

这是一个非常好的问题,clojure.spec API给出了(被授予的、简短的、不能令人满意的)答案:

:opt键用作文档,可供生成器使用。

我不认为你可以无效的地图,如果它包含一个额外的(这是你的意思是“禁止”,我想)键使用这种方法。但是,您可以使用此规范来确保::bad-key不存在:

(s/def ::m (s/and (s/keys :req [::a]) #(not (contains? % ::bad-key))))
(s/valid? ::m {::a "required!"})                        ; => true
(s/valid? ::m {::a "required!" ::b "optional!"})        ; => true
(s/valid? ::m {::a "required!" ::bad-key "no good!"})   ; => false

您可以使用以下规范将密钥的数量限制为所需的数量:

(s/def ::r (s/and (s/keys :req [::reqd1 ::reqd2]) #(= (count %) 2)))
(s/valid? ::r {::reqd1 "abc" ::reqd2 "xyz"})              ; => true
(s/valid? ::r {::reqd1 "abc" ::reqd2 "xyz" ::extra 123})  ; => false

不过,最好的方式来处理这个IMO,将是简单地忽略有一个关键的存在,你不关心。

希望随着spec的成熟,这些美好的东西会被添加进来。或者,也许他们已经在那里(它正在迅速变化)而我根本不知道这件事。这在clojure中是一个非常新的概念,因此我们大多数人都有很多东西需要学习。

关于:opt键,我认为最初的答案仍然很好--它是文档,实际上,它允许生成这些可选指定的键:

(s/def ::name #{"Bob" "Josh" "Mary" "Susan"})
(s/def ::height-inches (s/int-in 48 90))
(s/def ::person (s/keys :req-un [::name] :opt-un [::height-inches]))

(map first (s/exercise ::person))

; some generated data have :height-inches, some do not
({:name "Susan"}
 {:name "Mary", :height-inches 48}
 {:name "Bob", :height-inches 49}
 {:name "Josh"}
 类似资料:
  • 问题内容: 我实现了使用,并且需要在期间禁用适配器项。 我尝试了以下方法,但是单击通常会发生: 问题答案: 使用我们处理过的逻辑。这将禁用适配器项,而不是其父项。 实现应如下所示: 用法:

  • 我利用最后几天在Clojure和ClojureScript中深入挖掘了Clojure.spec。 到目前为止,我发现在依赖某种格式的数据的公共函数中,在和中使用规范作为警卫是非常有用的。 有没有人知道如何在或防护中获得更好的错误消息? 我知道和,但这对那些或警卫没有帮助。

  • 我不明白为什么会出现下面的spec错误。 有人能告诉我为什么吗? 以下是错误说明。

  • 问题内容: 我用Java开发的软件有问题。用户必须在JtextPane中编写文本。如果没有时间给他写信,则会出现一个弹出窗口。唯一的问题是:如果在弹出消息时用户正在写,则弹出窗口消失,因为按下的键验证了消息。 无论如何,我可以禁用此功能吗?我用它来创建MessageDialog: 谢谢阅读。 问题答案: 禁用正常的应用程序行为(例如,使用键操作对话框)不是一个好主意。它使许多用户感到困惑,这些用户

  • 问题内容: 我想使用JPA(eclipselink)从数据库中获取数据。该数据库由许多其他来源更改,因此我想针对我执行的每个查找返回数据库。我已经阅读了许多有关禁用缓存的文章,但这似乎不起作用。有任何想法吗? 我正在尝试执行以下代码: 一==二是正确的,而我希望它是错误的。 我尝试将以下每个/所有内容添加到我的persistence.xml中 我也尝试过将@Cache注释添加到实体本身: 我误会了

  • 问题内容: 是否可以通过配置在Rails 3.2中全局禁用新的解释功能?我正在使用activerecord-sqlserver-adapter 3.2.1,并且gem的解释(显示计划)部分似乎存在一些错误。 问题答案: 引用http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails- explain/ 新的应用程序得到 在。Ac