【发布时间】:2011-05-03 03:59:49
【问题描述】:
这是我一直想知道的事情。我经常看到这种模式:
if (pf.isDefinedAt(in)) pf(in)
通过将其分解为两个单独的调用,在#isDefinedAt 中评估的所有模式随后也在#apply 中评估。例如:
object Ex1 {
def unapply(in: Int) : Option[String] = {
println("Ex1")
if (in == 1) Some("1") else None
}
}
object Ex2 {
def unapply(in: Int) : Option[String] = {
println("Ex2")
if (in == 2) Some("2") else None
}
}
val pf : PartialFunction[Int,String] = {
case Ex1(result) => result
case Ex2(result) => result
}
val in = 2
if (pf.isDefinedAt(in)) pf(in)
打印出来的
Ex1
Ex2
Ex1
Ex2
res52: Any = 2
在最坏的情况下,当您的模式最后匹配时,您在调用 PartialFunction 时已经评估了您的模式/提取器两次。当匹配不仅仅是简单的类或列表模式匹配的自定义提取器时,这可能会变得低效(例如,如果您有一个解析 XML 文档并返回一些值对象的提取器)
PartialFunction#lift 遭受同样的双重评估:
scala> pf.lift(2)
Ex1
Ex2
Ex1
Ex2
res55: Option[String] = Some(2)
有没有一种方法可以有条件地调用一个函数,如果它被定义而不可能调用你所有的提取器两次?
【问题讨论】:
标签: scala functional-programming scala-2.8