Похоже, что 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 с созданием isDefinedAt
из части if i > 0 && i < 3
?
Кроме того, 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)
Тогда почему это совпадение с образцом класса case работает?
Я предполагаю, что компилятор Scala разумно выполняет множество неявных операций, но это сбивает меня с толку, чтобы понять, что происходит и как писать код Scala.
Если есть хорошие ссылки вместо спецификаций языка или компилятора, чтобы понять синтаксис кода Scala и способ написания кода Scala, пожалуйста, предложите.