3

Scalaを学び始めたばかりです。Scaladocs をブラウジングしているときに、このメソッド定義が次の場所にあるのを見ましたmutable.Map

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

とにかくa で定義するだけなら、なぜelem1and を明示的に定義する必要があるのでしょうか?elem2elems*

4

2 に答える 2

9

単一のパラメーターを持つ別のオーバーロードされたメソッドが既に存在することに注意してください。

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

したがって、あと 2 つのパラメーターの制約は、あいまいな呼び出しを避けるためです。単一のパラメーターを持つ別のメソッドの理由は、効率的である可能性があります。可変引数メソッドを呼び出すには、バックグラウンドで配列を作成する必要があることに注意してください。これは、削除する要素が 1 つしかない場合に無駄になります。

メソッドの単一引数バージョンは抽象的ですが、複数引数バージョンは具体的であるため、後者の実装が前者を (機能的に同等の) ループで実際に呼び出しても驚かないでしょう。(更新:呼び出しは を介し​​た間接的ですが、簡単なコード チェック--=で私の推測が確認されました。)

于 2013-03-07T17:20:47.970 に答える
1

2つ以上の状態のためだと思います。

その署名を使用すると、少なくとも 2 つの型の引数をAメソッドに渡すことを明確に強制できます。

のみを使用した場合*elems、0 個以上の要素を削除することになり、あまり意味がありません。

2つ以上を削除するための署名を明確に持っているという事実、およびそれが理にかなっているかどうかは、この回答の範囲を超えています。@PéterTörökが言ったように、このメソッドを1つのパラメーターと2つ以上のパラメーターでオーバーロードする理由は、効率かもしれません。

于 2013-03-07T17:13:13.827 に答える