Чтобы создать новый класс, который можно использовать в Scala для понимания, кажется, что все, что вам нужно сделать, это определить функцию карты :
scala> class C[T](items: T*) {
| def map[U](f: (T) => U) = this.items.map(f)
| }
defined class C
scala> for (x <- new C(1 -> 2, 3 -> 4)) yield x
res0: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
Но это работает только для простых циклов for, в которых нет сопоставления с образцом в левой части <-
. Если вы попытаетесь найти там сопоставление с образцом, вы получите жалобу на то, что метод filter
не определен:
scala> for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
<console>:7: error: value filter is not a member of C[(Int, Int)]
for ((k, v) <- new C(1 -> 2, 3 -> 4)) yield k -> v
Почему здесь требуется фильтр для реализации сопоставления с образцом? Я бы подумал, что Scala просто переведет приведенный выше цикл в эквивалентный вызов map
:
scala> new C(1 -> 2, 3 -> 4).map{case (k, v) => k -> v}
res2: Seq[(Int, Int)] = ArrayBuffer((1,2), (3,4))
Но это, похоже, работает нормально, поэтому цикл for нужно преобразовать во что-то другое. На что это переведено, для чего нужен метод filter
?