2013-03-07 1 views
3

저는 스칼라를 배우기 시작했습니다.스칼라에서 하나, 둘, 많은 인수를 선언하십시오.

def -=(elem1: A, elem2: A, elems: A*): Map.this.type 
    Removes two or more elements from this shrinkable collection. 

    elem1 the first element to remove. 
    elem2 the second element to remove. 
    elems the remaining elements to remove. 
    returns the shrinkable collection itself 

가 왜 elem1elem2 방금 ​​어쨌든 *elems를 정의하는거야 경우 명시 적으로 정의해야 다음 Scaladocs을 검색하는 동안 나는 mutable.Map에서이 메서드 정의를 보았다?

+0

링크는'Set'이 아닌'mutable.Map'을 참조합니다. 코드가'Map'을 참조하기 때문에 나는 자유의 길을 따라 링크의 텍스트를 업데이트했다. –

답변

9

주의 사항 :

abstract def -=(key: A): Map.this.type 

는 그래서 두 개 이상의 매개 변수 제약은 모호한 호출을 방지하는 것입니다. 단일 매개 변수를 사용하는 별도의 메서드를 사용하는 이유는 효율성 때문일 수 있습니다. 가변 인수 메소드를 호출하는 것은 백그라운드에서 배열을 생성하는 것을 포함하는데, 제거 할 요소가 하나만있는 경우에는 낭비됩니다.

다중 인수 버전이 구체적이지만 메소드의 단일 인수 버전이 추상이므로 후자의 구현에서 사실상 루프의 기능적으로 동일한 함수를 호출하면 놀라지 않을 것입니다. (업데이트 : quick code check 내 추측을 확인했지만, 전화는 --=을 통해 간접적입니다.)

1

두 개 이상이 상태라고 말하고 싶습니다.

해당 서명을 사용하면 메소드에 전달할 A 유형의 인수가 두 개 이상 명확하게 적용됩니다.

*elems 만 사용한 경우 0 개 이상의 요소를 제거하면 의미가 없습니다.

2 개 이상을 삭제하기위한 서명이 있고 그것이 의미가 있는지 여부는이 답변의 범위를 벗어납니다. @ Péter Török가 말했듯이이 방법에 하나의 매개 변수를 오버로드하는 이유와 두 개 이상의 매개 변수가 효율성이 될 수 있습니다.

이미 하나의 매개 변수를 사용하여 별도의 오버로드 된 메서드가 있다고
+0

"그것이 의미가 있는지 없는지는"내가 바라는 것이 었습니다. 이 선언은 내가 그곳에 좋은 이유가 있다고 기대할 정도로 이상하다. 나는 그 추론이 무엇인지 알고 싶다. –

관련 문제