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 elem1,为什么还需要明确定义?elem2elems*

4

2 回答 2

9

请注意,已经有一个带有单个参数的单独重载方法:

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

所以多加两个参数约束是为了避免歧义调用。使用单个参数的单独方法的原因可能是效率。请注意,调用可变参数方法涉及在后台创建一个数组,如果只有一个元素要删除,这将是浪费的。

由于该方法的单参数版本是抽象的,而多参数版本是具体的,如果后者的实现实际上在循环(功能等价物)中调用了前者,我不会感到惊讶。(更新:快速代码检查验证了我的猜测,尽管调用是通过 .)间接调用的--=。)

于 2013-03-07T17:20:47.970 回答
1

我会说是因为有两个或更多的条件。

使用该签名,您清楚地强制要求将至少两个类型A的参数传递给该方法。

如果您只使用*elems,则意味着删除 0 个或更多元素,这没有多大意义。

您特别具有删除 2 或更多的签名这一事实,以及它是否有意义,超出了此答案的范围。就像@PéterTörök 所说,用一个参数重载这个方法的原因,两个或多个参数可能是效率。

于 2013-03-07T17:13:13.827 回答