2014-10-15 12 views
5

यह देखते हुए कि Seq.viewSeqView देता है, तो मुझे Set.viewSetView वापस करने की उम्मीद होगी, लेकिन ऐसा कोई दृश्य मौजूद नहीं है; Set.view इसके बजाय IterableView देता है।स्कैला के पास 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 विधि नहीं है (यह मूल रूप से ढूंढने का एक विशेष मामला है)?

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

काफी नहीं सामान्य विकल्प, लेकिन 'सेट (1, 2, 3) .exists (x => x * 2 == 4) ' –

उत्तर

2

कोई SetView नहीं है क्योंकि विचारों परेशान कर सकती हैं:

ऊपर स्थिति को देखते हुए, वहाँ इस के लिए एक बेहतर विकल्प है जब सेट पर काम करने (दूसरे शब्दों में, स्काला में सबसे अच्छा अभ्यास क्या है) गर्दन में कार्यान्वयन और परीक्षण करने के लिए, और यह प्रयास कम मूल्यवान है क्योंकि सेट के अच्छे गुणों के लिए आम तौर पर आपको पहले से ही उत्सुकता से पूरे सेट को बनाने की आवश्यकता होती है (उदाहरण के लिए O(1) या O(log n) लुकअप)। इसलिए हुआ क्योंकि उस SetIterable प्रदान करता है और एक Setcontains टाइप जाँच जब तक आप कुछ है कि सेट में हो सकते की मांग नहीं करनी चाहिए

containsIterable में नहीं है। चूंकि Iterable कॉन्वेंटेंट है, इसलिए contains आपको कुछ भी मांगने के लिए स्वीकार करना होगा (Seq करता है)।

एक कामकाज के रूप में, आप ध्यान दें कि contains(x)exists(_ == x), और exists पर समान है Iterable पर है।

संबंधित मुद्दे