2024 Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解更多关于如何使用本站的信息。

0
Spec
重分类

我的应用程序用于模拟钢琴琴键,我正在尝试为它们编写spec。我的第一次尝试很简单,它们是八度和一个琴键的映射。

(spec/def ::octave (spec/int-in 0 9))

(spec/def ::key (spec/int-in 0 12))

(spec/def ::note (spec/keys :req-un [::octave ::key]))

现在的问题是,如果八度数是零,则只有A、A♯和B是有效的琴键。如果八度数是8,则只有C是有效的琴键。
实际上这很重要,因为否则将钢琴琴键转换为键盘上的编号将导致无效值,如-8或96。

我的问题是,是否有简单的方法可以指定根据映射中的一个值,只允许另一个键有一些有效值?这似乎是一个很常见的问题。或者我是做错了什么基本的事情?

1 答案

+1

被选中
 
最佳答案

我认为一个答案是对此是否是正确的数据模型进行重新评估(可能从编号键开始),但暂时先放一边。

您始终可以添加一个任意谓词函数,该函数限制允许的值。

(defn piano-note? [{:keys [octave key]}]
  ...constraints...)
    
(spec/def ::piano-note (s/and ::note piano-note?))

在s/keys内部没有做到这一点的方法。

...