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(_)))
2番
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 コンパイラ
が部分からの生成でFirst{ case i:Int if i > 0 && i < 3 => i }
の実装形式に自動的に変換するためでしょうか。isDefinedAt
if i > 0 && i < 3
また、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 のコードの書き方を理解するための参考文献があれば、提案してください。