почему фильтр должен быть определен для сопоставления с образцом в цикле for в scala?

Чтобы создать новый класс, который можно использовать в 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 ?

18
задан Steve 7 December 2010 в 19:39
поделиться