2014-10-15 2 views
5

Учитывая, что Seq.view возвращает SeqView, я бы ожидал Set.view, чтобы вернуть SetView, но такого вида нет; Set.view вместо этого возвращает IterableView.Почему у Scala есть SeqView, но не SetView?

К сожалению, у IterableView отсутствует какие-либо методы, например contains. Сравните эти, например:

Seq(1, 2, 3).view.map(_ * 2).contains(4) // returns true 
Set(1, 2, 3).view.map(_ * 2).contains(4) // error 

Есть ли какая-либо конкретная причина, почему нет SetView класса не существует?

Кроме того, есть ли причина, почему Iterable не имеет метода contains (учитывая, что это в основном частный случай поиска)?

Учитывая ситуацию выше, есть лучшая альтернатива этому при работе с наборами (другими словами, что является лучшей практикой в ​​Scala):

Set(1, 2, 3).view.map(_ * 2).find(_ == 4).isDefined 
+1

О содержании содержит: http://stackoverflow.com/questions/2925765/why-does-iterator-have-a-contains-method-but-iterable-does-not-in-scala-2-8 –

+1

Не совсем общая альтернатива, но 'Set (1, 2, 3) .exists (x => x * 2 == 4)' –

ответ

2

Там нет SetView, потому что взгляды боль в шею, чтобы реализовать и протестировать, и это усилие меньше стоит того, поскольку хорошие свойства наборов обычно требуют, чтобы вы уже с нетерпением создали весь набор (например, O(1) или O(log n)).

contains не в Iterable именно потому, что Set расширяет Iterable и Setcontains не следует вводить проверить, если вы не просите что-то, что может быть в комплекте. Поскольку Iterable является ковариантным, его contains должен был бы признать, что вы просите что-нибудь (как contains для Seq).

В качестве обходного пути вы можете отметить, что contains(x) делает то же самое, что и exists(_ == x), а exists - на Iterable.