2014-10-15 3 views
5

Vorausgesetzt, dass Seq.view eine SeqView zurückgibt, hätte ich erwartet Set.view, um eine SetView zurückgeben, aber keine solche Ansicht existiert; Set.view gibt stattdessen IterableView zurück.Warum hat Scala SeqView, aber nicht SetView?

Leider fehlen IterableView einige Methoden wie contains. Vergleichen Sie diese zum Beispiel:

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

Gibt es einen besonderen Grund, warum keine SetView Klasse existiert?

Gibt es auch einen Grund, warum Iterable keine contains Methode hat (vorausgesetzt, das ist im Grunde ein Sonderfall von finden)?

die Situation oben gegeben, eine bessere Alternative dazu ist es, wenn sie mit Datensätzen arbeiten (in anderen Worten, was ist die beste Praxis in Scala):

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

Über enthält: http://stackoverflow.com/questions/2925765/why-does-iterator-have-a-contains-method-but-iterable-does-not-in-scala-2-8 –

+1

Nicht ganz allgemeine Alternative, aber 'Set (1, 2, 3) .existiert (x => x * 2 == 4)' –

Antwort

2

Es gibt keine SetView weil Ansichten ein Schmerz sind im Nacken zu implementieren und zu testen, und dieser Aufwand ist es weniger wert, da die netten Eigenschaften von Sets im Allgemeinen erfordern, dass Sie bereits eifrig das gesamte Set erstellt haben (zB O(1) oder O(log n) lookup).

contains ist nicht in Iterable gerade weil SetIterable erstreckt und ein Setcontains sollte geben Sie nicht überprüfen, wenn Sie nach etwas fragen, die in der Menge sein könnte. Da Iterable kovariant ist, müsste sein contains zugeben, dass Sie um irgendetwas bitten (wie das contains für Seq tut).

Als Workaround können Sie beachten, dass contains(x) das Gleiche tut wie exists(_ == x), und exists ist auf Iterable.

Verwandte Themen