为什么Scala部分中不允许使用重复参数的默认参数?

djs*_*lla 7 scala

根据Scala规范第4.6.3节:

不允许在带有重复参数的参数部分中定义任何默认参数.

实际上,如果我定义以下case类:

case class Example(value: Option[String] = None, otherValues: String*)
Run Code Online (Sandbox Code Playgroud)

我得到的结果是根据规范的预期:

error: a parameter section with a `*'-parameter is not allowed to have default arguments
   case class Example(value: Option[String] = None, otherValues: String*)
Run Code Online (Sandbox Code Playgroud)

但问题是为什么不允许这样做?该类的第一个参数完全独立于重复的参数,那么为什么这个限制存在呢?

Arc*_*heg 8

因为你可以这样做:

case class Example(value: String = "default", otherValues: String*)
Run Code Online (Sandbox Code Playgroud)

现在,如果你打电话Example("Hello", "world"),第一个"Hello"属于value或是otherValues

你可能会争辩说你的例子中的类型是不同的,但规则变得太复杂而无法遵循.例如,经常与Any类型一起使用的重复参数.这个例子case class Example(value: Option[String] = None, otherValues: Any*)有不同的类型,但仍然遇到同样的问题

  • 接下来是强制关键字参数,可选关键字参数以及最后的关键字参数.因此,原因不一定是"它不能明确无误",而是"使其明确无法与其他语言的简单性完全吻合".因此,如果我们遵循Ruby规则,``Hello``将绑定到`value`并且`seq("world")`绑定到`otherValues`,并且没有歧义. (3认同)