在scala中重写toString并使用默认参数

时间:2016-06-14 03:54:07

标签: scala override tostring default-parameters

我有一个与数字相关的复杂类,我编写了以下代码:

override def toString: String = toString()

def toString(precision: Int = 2, showImag:Boolean = true): String = ???

第二种方法的实施并不重要。这样做的问题是toString()会调用toString并无休止地递归。我可以用toString()替换toString(2),但我认为这很难看,因为2已经隐含了。有没有办法在不指定参数或重命名函数的情况下使用第二个函数?

<小时/> 的修改

由于答案和评论显示不可能(阅读他们的解释原因)。我意识到解决这个问题的方法是创建一个具有不同名称的私有方法,该方法由另外两个公共方法调用,并包含实际的实现,如下所示:

override def toString: String = toStringImpl(2, true)

def toString(precision: Int = 2, showImag:Boolean = true): String = toStringImpl(precision, showImag)

private def toStringImpl(precision: Int, showImag:Boolean): String = ???

你可以说这是更多的代码行,你可以说它确实没有给出一个已经默认的参数。这两种方法都有效,我认为进一步讨论哪种方法更好,因为它们都有其优点和缺点是主观的。

1 个答案:

答案 0 :(得分:2)

  

有没有办法在不指定参数或重命名函数的情况下使用第二个函数?

无论您做什么,toString()都会调用从toString()继承的Any,因为这是最具体的匹配方法。