"Или"- два варианта в Scala?

Я хочу сделать что-то вроде этого:

def or[A](x: Option[A], y: Option[A]) = x match {
 case None => y   
 case _ => x 
}

Какой идиоматический способ сделать это? Лучшее, что я могу придумать, было Seq(x, y).flatten.headOption

3 ответа

Решение

Это уже определено для Option:

def or[A](x: Option[A], y: Option[A]) = x orElse y

В scalaz вы можете использовать класс типов Plus для этого:

scala> 1.some <+> 2.some
res1: Option[Int] = Some(1)

scala> none[Int] <+> 2.some
res2: Option[Int] = Some(2)

scala> none[Int] <+> none[Int]
res3: Option[Int] = None

Если по какой-то причине вы не хотите использовать orElse, в Scala всегда есть другой способ сделать это.

def or[A](xOpt: Option[A], yOpt: Option[A]) = xOpt.map(Some(_)).getOrElse(yOpt)
Другие вопросы по тегам