在Scala中声明一个,两个,多个参数

时间:2013-03-07 17:10:33

标签: scala map variadic-functions

我刚开始学习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

如果您只是要用elem1来定义elem2,为什么还需要明确定义elems*

2 个答案:

答案 0 :(得分:9)

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

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

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

由于该方法的单参数版本是抽象的而多参数版本是具体的,如果后者的实现实际上称之为(功能等同于)循环,我不会感到惊讶。 (更新:quick code check验证了我的猜测,虽然通过--=进行了间接调用。)

答案 1 :(得分:1)

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

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

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

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