我做表格validation。想象一下,我们想要验证Cat
案例类字段的某些子集:
case class Cat(name: String, age: Int, weight: Double)
def validateCatName(name: String): ValidationResult[String]
def validateCatAge(age: Int): ValidationResult[Int]
def validateCatForm(cat: Cat): ValidationResult[Cat] = {
(validateCatName(cat.name),
validateCatAge(cat.age)
).mapN((_, _) => cat)
}
我无法理解mapN((r1, ..., rN) => Result(r1, ..., rN))
。
例如,在我的情况下,我必须mapN((validatedName, validatedAge) => Cat(validatedName, validatedAge, cat.weight)
。
实际上我想忽略经过验证的结果,并且使用哑的params重新映射。像这样:
def validateCatForm(cat: Cat): ValidationResult[Cat] = {
(validateCatName(cat.name),
validateCatAge(cat.age)
).ifValid(cat)
}
有可能吗?
答案 0 :(得分:2)
您可以忽略参数并直接返回cat
:
def validateCatForm(cat: Cat): ValidationResult[Cat] = {
(
validateCatName(cat.name),
validateCatAge(cat.age)
).mapN{ (_, _) => cat }
}
但是,请记住,通常构造函数的工作是确保每个构造的Cat
实际上是有效的。 validateCatForm
应该直接接受name
和age
,然后你可以写:
def validateCatForm(name: String, age: Int): ValidationResult[Cat] = {
(
validateCatName(name),
validateCatAge(age)
).mapN{ new Cat(_, _) }
}
通过这种方式,您不会强制API的用户创建任何无效的Cat
,只是为了将它们传递给表单验证方法。