在 scala 中覆盖 toString 并使用默认参数创建第二个 toString 方法
overriding toString in scala and creating a second toString method with default parameters
我有一个与复数相关的 class,为此我编写了以下代码:
override def toString: String = toString()
def toString(precision: Int = 2, showImag:Boolean = true): String = ???
第二种方法的实现并不重要。这样做的问题是 toString()
将调用 toString
并且会无限递归。我可以将 toString()
替换为 toString(2)
,但我认为这很难看,因为 2 已经隐含了。有没有办法在不指定参数或重命名函数的情况下使用第二个函数?
编辑:
正如答案和评论所示,这是不可能的(阅读他们的解释)。我意识到解决这个问题的一种方法是创建一个具有不同名称的私有方法,该方法由其他两个 public 方法调用并包含实际实现,如下所示:
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 = ???
你可以说这是多行代码,也可以说它确实没有提供已经默认的参数。这两种方法都有效,我认为进一步讨论哪种方法更好是主观的,因为它们各有优缺点。
Is there a way to use the second function without specifying parameters or renaming the function?
无论你做什么,toString()
都会调用继承自Any
的toString()
,因为它是最具体的匹配方法。
我有一个与复数相关的 class,为此我编写了以下代码:
override def toString: String = toString()
def toString(precision: Int = 2, showImag:Boolean = true): String = ???
第二种方法的实现并不重要。这样做的问题是 toString()
将调用 toString
并且会无限递归。我可以将 toString()
替换为 toString(2)
,但我认为这很难看,因为 2 已经隐含了。有没有办法在不指定参数或重命名函数的情况下使用第二个函数?
编辑:
正如答案和评论所示,这是不可能的(阅读他们的解释)。我意识到解决这个问题的一种方法是创建一个具有不同名称的私有方法,该方法由其他两个 public 方法调用并包含实际实现,如下所示:
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 = ???
你可以说这是多行代码,也可以说它确实没有提供已经默认的参数。这两种方法都有效,我认为进一步讨论哪种方法更好是主观的,因为它们各有优缺点。
Is there a way to use the second function without specifying parameters or renaming the function?
无论你做什么,toString()
都会调用继承自Any
的toString()
,因为它是最具体的匹配方法。