【发布时间】:2019-11-16 11:57:01
【问题描述】:
看起来First和Second是一样的,但是为什么呢?
第一
val iter = List(1, 2, 3, 4, 5).iterator
val first = iter.collect(new PartialFunction[Int, Int]{
def apply(i: Int) = i
def isDefinedAt(i: Int) = i > 0 && i < 3
})
first.foreach((println(_)))
第二
val iter2 = List(1, 2, 3, 4, 5).iterator
val second = iter2.collect {
case i:Int if i > 0 && i < 3 => i
}
second.foreach((println(_)))
是不是因为 Scala 编译器会自动转换
{ case i:Int if i > 0 && i < 3 => i } 转换成 First 的实现形式并从 if i > 0 && i < 3 部分生成 isDefinedAt?
另外,case i:Int if i > 0 && i < 3 => i 是 Case 类模式匹配,如果我是正确的。但是,在scala/src/library/scala/PartialFunction.scala 中,PartialFunction 没有 Case 类定义。
trait PartialFunction[-A, +B] extends (A => B)
那么为什么这种案例类模式匹配有效?
我认为 Scala 编译器智能地做了很多隐式工作,但它让我无法理解正在发生的事情以及如何编写 Scala 代码。
如果有好的参考资料,而不是语言或编译器规范,可以理解 Scala代码语法和Scala编写代码的方式,请指教。
【问题讨论】:
-
不,模式匹配不仅适用于案例类。
标签: scala partialfunction partial-functions