В частичной функции, реализованной с сопоставлением с образцом, как заставить isDefined
вернуть false
для недопустимых входных данных, которые не могут быть включены в шаблон дела?
Например, у меня есть следующее 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
оценивался как ложный для недопустимых входов. Например, для a
, которое decode(a)
оценивается как None
, decodeList.isDefinedAt(Json.Arr(List(a)))
должно оцениваться до false
.
Или с другой точки зрения, если я попытаюсь включить условие в шаблон случая как в следующем коде, куда я должен поместить определение val options = items map decode
, чтобы его можно было повторно использовать как для шаблона case, так и для блока?
def decodeList: PartialFunction[Json, List[A]] = {
case Json.Arr(items) if (options forall (_.isDefined)) =>
options map (_.get)
}