在
scala中,以下两个函数用于完全相同的目的:
@tailrec final def fn(str: String): Option[String] = { Option(str).filter(_.nonEmpty).flatMap { v => fn(v.drop(1)) } } @tailrec final def fn2(str: String): Option[String] = { Option(str).filter(_.nonEmpty) match { case None => None case Some(v) => fn2(v.drop(1)) } }
但是@tailrec仅适用于第二种情况,在第一种情况下它将生成以下错误:
Error: could not optimize @tailrec annotated method fn: it contains a
recursive call not in tail position
Option(str).filter(_.nonEmpty).flatMap { v =>