为什么这个字段验证是类型不匹配?

Why is this field validation a type mismatch?

我无法理解为什么 scala 会让我愉快地编写一些字段验证:

field -> text().verifying("declaration.additionalDocument.documentTypeCode.unacceptableCode", f => isEmpty(f) or !documentCodesNotAcceptable.contains(f))

但我这样做的时候不是:

text().verifying("declaration.additionalDocument.documentTypeCode.unacceptableCode", isEmpty or !documentCodesNotAcceptable.contains(_))

在第二种情况下,我得到一个编译错误告诉我 type mismatch; found : String => Boolean required: Boolean

但是为什么呢?第二种方式与第一种方式有何不同?

verifying 的第二个参数似乎是一个谓词。也就是说,一个函数取值 returns truefalse,这是验证框架的共同特征。

在第一个例子中谓词是

f => isEmpty(f) or !documentCodesNotAcceptable.contains(f)

解析为

f => (isEmpty(f) or !documentCodesNotAcceptable.contains(f))

这是一个完全合理的谓词,首先用 isEmpty 测试 f,如果失败,则进行第二次测试。

在第二个例子中,谓词是这样的:

isEmpty or !documentCodesNotAcceptable.contains(_)

其中(如评论中所述)扩展为

(x => isEmpty(x)) or (x => !documentCodesNotAcceptable.contains(x))

所以这个表达式试图 or 两个函数在一起,这是不支持的。

解决方案是使用第一个版本:)