2013-08-17 1 views
0

아시다시피 스칼라의 Nil은 불변 콜렉션 객체입니다. 나는 예를가변 스칼라 컬렉션의 객체가 없음

class ResourceMap extends mutable.HashMap[String, Int] { 
    .... 
    def -(o: ResourceMapType):ResourceMap = { 

     if (....) { 
      ...... 
     } else { 
      Nil // Exception : raises the `change return type to Nil.type` 
     } 
    } 
} 

를 들어, 내 사용자 지정 가변 수집에 문제가 그리고 내 질문에 내가 - 방법 무기 호를 반환 할 수있는 방법인가?

+0

인가'-' 기본지도의 차이를 반환? 그럼 왜 닐이 돌아 오니? 어쩌면 빈지도를 반환해야합니까? – tkroman

+1

'-'가 새로운 collection_을 반환하는 것으로 보입니다. 왜 전반적인 질문은 처음에 변경 가능한 컬렉션을 사용하려는 것입니까? 변경할 수없는 컬렉션은 수정 된 복사본을 반환하는 데보다 효율적입니다. 이러한 작업을 수행하고 구조 공유를 사용하여 이러한 작업을 최적화해야하기 때문입니다. –

답변

4

무기 호는 길이가 0 인 (비어 있음) 불변의 목록이 아니라 수집 유형에 대한 일반 빈 마커입니다. clear; this

+0

나는 반환 (또는 기본 맵 설정) Map.empty – tkroman

+1

@cdshines mutable.HashMap.empty가 ResourceMap (슈퍼 클래스가 하위 클래스되지 않는)되지는 HashMap을 반환 권하고 싶습니다. 당신이 할 수있는 일은,'new ResourceMap'을 리턴하는'empty' 메소드를 오버라이드 한 다음,'-' 메소드에서 호출하는 것입니다. – Shadowlands

+0

그래, 우리는'new ResourceMap.empty'를 써야 할 필요가있는 것처럼 보입니다. 어쨌든 때로는 더 명확 해 보일 수도 있습니다 : – tkroman

0

당신은 당신의 클래스와 사용에서 상속 빈 객체를 정의 할 수 있습니다 (현재지도를 취소하고 단지 비어있는 새 인스턴스를 반환하는 대신 그것을 반환 할 경우) 당신은 단순히 new ResourceMap를 원하거나 것 같습니다 당신은 예를 들어 빈 해시 맵

를 사용하고자 할 때 :

private object EmptyHashMap extends ResourceMap { } 

class ResourceMap extends HashMap[String, Int] { 

    def -(o: Something):ResourceMap = { 
     if(....){ 
     something 
     }else{ 
      EmptyHashMap 
     } 
    } 
} 
관련 문제