为什么不能指定Scala varargs参数的默认值?

tru*_*tin 6 scala variadic-functions default-parameters

我写了一个接受varargs作为参数的类,并指定它的默认值,以便用户可以经常实例化它而不指定参数:

class MyClass(values: Int* = 42) { }
Run Code Online (Sandbox Code Playgroud)

但是,编译器和REPL给出了以下错误:

<console>:7: error: type mismatch;
 found   : Int(42)
 required: Int*
       class MyClass(values: Int* = 42) { }
                                ^
<console>:7: error: a parameter section with a `*'-parameter is not allowed to have default arguments
       class MyClass(values: Int* = 42) { }
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我尝试了以下方法,但它也不起作用:(显然它很模糊.)

class MyClass(value: Int = 42, otherValues: Int*) { }
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不允许使用varargs参数的默认值.这里有什么理由或技术理由?(我的猜测是指定一个空的varargs需要一些特殊的语法或成语,但我不确定这是否足够的原因.)

huy*_*hjl 8

考虑一下这个问题,我认为这只是一个不增加太多复杂性的问题,假设你有

def f(a: A, xs: X* = Seq(x0, x1)) = ???
Run Code Online (Sandbox Code Playgroud)

现在调用者使用如下:f(a).

我们如何知道调用者是否打算X*通过不提供X*?来传递零长度列表或者想要触发默认参数?在您的示例中,您假设第二个替代方案是唯一的情况,并且编译器需要提供默认参数值.但是空Seq()的已经是调用者提供的完全有效的值.我猜调用者可以写f(a, Seq(): _*)但是很麻烦.


rar*_*rry 6

来自scala规范(第4.6.2节)

不允许使用重复参数在参数部分中定义任何默认参数

也许解决方法会有所帮助?

class MyClass(values: Int*) {
  def this() = this(5)
}
Run Code Online (Sandbox Code Playgroud)