2013-03-07 51 views
3

我剛開始學習Scala。在瀏覽過Scaladocs我看到mutable.Map這個方法定義:在Scala中聲明一個,兩個,很多參數

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*呢?

+0

您提供的鏈接引用'mutable.Map',而不是'Set'。由於代碼也提到了「地圖」,我冒昧地更新鏈接的文字。 – 2013-03-07 17:25:02

回答

9

注意,已經有一個單獨的重載方法與一個單一的參數:

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

所以兩個以上參數約束是爲了避免模棱兩可的呼叫。具有單個參數的單獨方法的原因可能是效率。請注意,調用變量參數方法涉及到在後臺創建一個數組,如果只有一個元素需要刪除,將浪費數據。

由於該方法的單參數版本是抽象的,而多參數版本是具體的,所以如果後者的實現實際上稱爲前者(在功能上等同於)循環,我不會感到驚訝。 (更新:一個quick code check驗證了我的猜測,雖然呼叫是間接通過--=。)

1

我會說因爲兩個或多個的條件。

使用該簽名,您明確強制執行至少兩個要傳遞給該方法的類型爲A的參數。

如果您僅使用*elems,則意味着要移除0個或更多元素,這沒有多大意義。

事實上,您具有簽名以刪除2個或更多,以及它是否有意義,這超出了此答案的範圍。就像@PéterTörök所說的那樣,用一個參數和兩個或更多參數來超載這個方法的原因可能是有效的。

+0

「以及它是否有意義」雖然是我期望的。這個聲明是非常不尋常的,我期望有一個很好的理由。我想知道推理是什麼。 – 2013-03-07 17:18:06