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需要一些特殊的语法或成语,但我不确定这是否足够的原因.)
考虑一下这个问题,我认为这只是一个不增加太多复杂性的问题,假设你有
def f(a: A, xs: X* = Seq(x0, x1)) = ???
Run Code Online (Sandbox Code Playgroud)
现在调用者使用如下:f(a).
我们如何知道调用者是否打算X*通过不提供X*?来传递零长度列表或者想要触发默认参数?在您的示例中,您假设第二个替代方案是唯一的情况,并且编译器需要提供默认参数值.但是空Seq()的已经是调用者提供的完全有效的值.我猜调用者可以写f(a, Seq(): _*)但是很麻烦.
来自scala规范(第4.6.2节)
不允许使用重复参数在参数部分中定义任何默认参数
也许解决方法会有所帮助?
class MyClass(values: Int*) {
def this() = this(5)
}
Run Code Online (Sandbox Code Playgroud)