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

相信

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

class MyClass(values: Int* = 42) { }

但是,编译器和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) { }

作为一种变通办法,我尝试了以下操作,但是它也不起作用:(显然,它非常模棱两可。)

class MyClass(value: Int = 42, otherValues: Int*) { }

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

休伊

考虑一下,我想这只是不增加太多复杂性的问题,假设您有

def f(a: A, xs: X* = Seq(x0, x1)) = ???

现在,呼叫者使用的是这样的:f(a)

我们如何知道调用方是否打算X*通过不提供零长度列表或希望通过不提供默认值来触发默认参数X*在您的示例中,您假定只有第二种情况,并且编译器需要提供默认参数值。但是,空Seq()值已经是调用方提供的完全有效的值。我猜呼叫者可以写,f(a, Seq(): _*)但是很麻烦。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Scala中为varargs参数设置默认值?

Scala中类型参数的默认值

synclient参数的默认值是什么?

为什么我的Enum参数返回到默认值?

为什么可选参数的默认值必须为常数?

Argparse可选参数,如果指定了默认值,则默认值不同

为什么即使指定了参数,argparse仍包含可选参数的默认值?

在 C# 中指定参数属性的默认值

Scala方法中变量参数的默认值

Scala quasiquote 生成带反引号的参数默认值

默认值为null的Scala别名参数抛出NullPointerException

Scala中参数中函数的默认值

有什么办法可以区分Oracle中的“参数没有默认值”和“参数的默认值为null”

为什么不可能显式地默认具有volatile参数的副本构造函数?

为什么重新分配参数不适用于具有默认值的参数?

为什么具有单个参数值的函数之后必须为每个参数指定默认值?

为什么不能将GETDATE()用作过程参数的默认值或EXECUTE语句中的值?

在C ++中,是否真的不可能跳过带有默认参数的模板参数,为什么语法建议否则呢?

指定集合的默认值

为什么在指定所有模板参数都具有默认值的模板类时需要<>?

为什么C ++不允许将函数参数用作默认值?

为什么Xcode并不总是显示参数默认值的提示?

给定默认值时,为什么此模板参数推导失败?

为什么不能将默认值作为null以外的可选参数提供?

为什么我无法使用默认值获取参数长度?

为什么 Typescript 类中的箭头类成员函数无法识别参数属性的默认值?

什么是ContinueWith默认值

为什么不可能用不同的类型参数多次实现通用接口?

为什么包含不可能的条件分支会更改此方法的返回值?