Чтобы создать новый класс, который можно использовать в 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))
Но это работает только для простых циклов, где нет совпадений шаблонов в левой части <-
. Если вы попытаетесь сопоставить шаблон, вы получите жалобу о том, что метод 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
?