Я пытаюсь определить trait Required
, чтобы инкапсулировать логику для проверки наличия требуемых Record
Field
, однако мне не удалось выяснить, каким должен быть тип self. Моя цель - написать что-нибудь как можно ближе, например, к object foo extends SomeField(...) with Required
, однако я понимаю, что мне, возможно, придется явно передать некоторые параметры типа в Required
.
Мой некомпетентный подход был таков:
import net.liftweb.record.Field import net.liftweb.util.FieldError
trait Required[ThisType, OwnerType] {
this: Field[ThisType, OwnerType] =>
def errMsg = "is required"
override def validations = {
val required =
(x: String) => if (x.isEmpty) List(FieldError(this, errMsg)) else Nil
// this asInstanceOf call also seems fishy
// --why's it even required if we already have the self type in place?
required :: super.asInstanceOf[Field[ThisType, OwnerType]].validations
}
}
однако это приводит к ошибкам компиляции и предупреждениям, связанным с экзистенциальными типами из:
myfield = object SomeField(...) with Required[SomeField[SomeModel], SomeModel]
не говоря уже о том, что это так далеко от лаконичного with Required
.
РЕДАКТИРОВАТЬ:
Вместо этого я придумал:
trait Required[OwnerType] extends Field[String, OwnerType] {
def errMsg = "is required"
override def validations = {
val required =
(x: String) => if (x.isEmpty) List(FieldError(this, errMsg)) else Nil
required :: super.validations
}
}
однако он не позволяет мне добавлять required
к super.validations
, потому что ожидает this.type.ValueType => List[FieldError]
, а не String => List[FieldError]
, что я считаю странным, потому что в случае Field[String, ...]
ValueType
равно String
.
Если я изменю required
на ValueType => ...
, он компилируется, но with Required[SomeModel]
выдает ошибки:
аргументы типа [String, OwnerType] не соответствуют границам параметра типа поля [ThisType, OwnerType ‹: net.liftweb.record.Record [OwnerType]]
... даже несмотря на то, что StringField.ThisType
это String
, а String.OwnerType
является подклассом Record[SomeModel]
, а SomeModel
является подклассом MongoRecord[SomeModel]
. -Я потерялся.
P.S. Это связано с Lift Record: пустое значение для обязательного поля, но без ошибок проверки