我有一个函数定义为:
def par(min: Int = -1, exact: Int = -1, auto: Boolean = false) = {
require(min > 0 || exact > 0 || auto, "Invalid argument")
OpPar(drm, minSplits = min, exactSplits = exact)
}
在使用此功能的另一个函数中,我将“选项”传递给par
参数。我想允许par
使用它自己的默认值,但是没有看到如何在Scala中做到这一点(没有难看的逻辑),因此实际上我必须重新定义默认值。
drmARaw.par(
min = minPar.getOrElse(-1),// if par changes this may the be wrong default
exact = exactPar.getOrElse(-1),// if par changes this may the be wrong default
auto = autoPar.getOrElse(true))
如果默认值曾经更改过,则会将错误的默认值传递给min
和exact
。使用复杂的逻辑,我可以决定哪个版本的par
基础上,以呼叫Option
PARAMS是nonEmpty
用于minPar
和exactPar
但这是很丑陋并且必须要对默认PARAMS每个函数以不同的方式写。实际上,每个Scala库都存在这种情况。如果他们更改了默认值,但我没有注意到它,我的代码将被破坏。
上面的示例说明了该问题,但我正在寻找一种Scala惯用法,该惯用法将覆盖函数具有可以更改的默认值的每种情况。我想编写独立于lib函数中默认参数更改的代码。
因此,据我所知Option
,您需要解包并作为传递的参数发送三个,除非有任何选项,否则被None
调用的方法应针对丢失的参数使用其自己的默认值。
在我看来,您唯一的选择是蛮力。
(minPar, exactPar, autoPar) match {
case (Some(m),Some(e),Some(a)) => par(min=m, exact=e, auto=a)
case (Some(m),Some(e),None) => par(min=m, exact=e )
case (Some(m),None, Some(a)) => par(min=m, auto=a)
case (Some(m),None, None) => par(min=m )
case (None, Some(e),Some(a)) => par( exact=e, auto=a)
case (None, Some(e),None) => par( exact=e )
case (None, None, Some(a)) => par( auto=a)
case (None, None, None) => par()
}
有了2个参数,这很容易。有了3,它是易于管理的。之后....痛苦的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句