2014-10-15 6 views
5

Seq.viewSeqView을 반환하면 Set.viewSetView을 반환 할 것으로 예상했지만 그러한보기는 존재하지 않습니다. Set.view 대신 IterableView을 반환합니다.스칼라에는 SeqView가 있지만 SetView는없는 이유는 무엇입니까?

불행히도 IterableView에는 contains과 같은 일부 방법이 없습니다. 예를 들어, 이러한 비교 : 더 SetView 클래스가 존재하지 않는 이유는 어떤 특별한 이유가

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

있습니까?

또한 Iterable에는 contains 메서드가없는 이유가 있습니까 (이것이 기본적으로 find의 특별한 경우 임). 뷰는 고통 때문에

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) 조회). SetIterable를 확장하고 Setcontains 당신이 설정 될 수있는 일을 요청하지 않는 한 확인 입력하지 않아야 정확하게 때문에

containsIterable에 있지 않습니다. Iterable은 공변 (covariant)이기 때문에, contains은 무엇이든 물어볼 수 있습니다 (containsSeq).

해결 방법으로 contains(x)exists(_ == x)과 같고 existsIterable입니다.