В частичной функции, реализованной с сопоставлением шаблонов, как заставить isDefined
возвращать false
для недопустимых входных данных, которые нельзя включить в шаблон case?
Например, у меня есть следующая частичная функция decodeList
:
case class Arr(items: List[Json]) extends Json
def decode(data: Json): Option[A]
def decodeList: PartialFunction[Json, List[A]] = {
case Json.Arr(items) =>
val options = items map decode
if (options forall (_.isDefined)) options map (_.get)
else throw new Error // the partial function should be undefined here
}
Я хочу изменить код таким образом, чтобы decodeList.isDefinedAt
оценивалось как false для недопустимых входных данных. Например, для a
, которое decode(a)
оценивается как None
, decodeList.isDefinedAt(Json.Arr(List(a)))
должно оцениваться как false
.
Или, с другой точки зрения, если я попытаюсь включить условие в шаблон case, как в следующем коде, куда мне поместить определение val options = items map decode
, чтобы его можно было повторно использовать как в шаблоне case, так и в блоке?
def decodeList: PartialFunction[Json, List[A]] = {
case Json.Arr(items) if (options forall (_.isDefined)) =>
options map (_.get)
}