【发布时间】:2015-06-26 22:27:58
【问题描述】:
我正在尝试定义一个通用的验证框架。我正在考虑使用部分函数来定义规则并将它们传递给通用函数以评估并返回结果。代码如下所示:
def assert(name: TField, validator: PartialFunction[(Any*), String], input: Any*): Seq[ValidationError] = {
if (validator.isDefinedAt(input)) {
invalidInput(name.name, validator(input))
} else {
Seq.empty
}
}
assert(fieldA, hasValidValue, inputValue, allowedValues)
assert(fieldB, isPositive, input)
// =-=-=-=--=-=-= Validation Rules =-=-=-=-=-=-=-=
def hasValidValue[T] = PartialFunction[(T, Set[T]), String] {
case (input, validValues) if !validValues.contains(input) => "Value not allowed"
}
def isPositive = PartialFunction[Long, String] {
case value: Long if value <= 0 => "Value should always be positive"
}
但我不知道如何在这一行定义带有可变参数的偏函数参数:
def assert(name: TField, validator: PartialFunction[(Any*), String], input: Any*): Seq[ValidationError] = {
因此,即使上面的定义编译得很好,但在实际尝试调用 assert 时还是会出现编译器错误:
// Error: Type mismatch, Expected: ParitalFunction[Any, String], Found: PartialFunction[(Nothing, Set[Nothing]), String]
assert(fieldA, hasValidValue, inputValue, allowedValues)
// Error: Type mismatch, Expected: ParitalFunction[Any, String], Found: PartialFunction[Long, String]
assert(fieldB, isPositive, input)
那么我该如何定义呢?
【问题讨论】:
标签: scala scala-2.10