看起来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的实现形式with generate isDefinedAt
from if i > 0 && i < 3
part?
另外,case i:Int if i > 0 && i < 3 => i
如果我是正确的,是 Case 类模式匹配。但是,在scala/src/library/scala/PartialFunction.scala中,没有 Case 类定义PartialFunction
。
trait PartialFunction[-A, +B] extends (A => B)
那么为什么这个案例类模式匹配有效呢?
我想 Scala 编译器智能地做了很多隐式工作,但它让我无法理解正在发生的事情以及如何编写 Scala 代码。
如果有很好的参考资料,而不是语言或编译器规范,以了解 Scala 代码语法和 Scala 编写代码的方式,请提出建议。