是否可以知道默认参数是否作为实际参数值提供?换句话说,假设我定义了一个方法:
def myMethod(x: Int = 1) = x + 1
Run Code Online (Sandbox Code Playgroud)
那么是否可以在方法体内区分这两个调用(返回相同的结果,因为第二个方法调用中的参数与方法定义中的默认值具有相同的值):
myMethod()
myMethod(1)
Run Code Online (Sandbox Code Playgroud)
换句话说,我想知道是否有技术可以实现类似于Common Lisp函数定义中的-supplied-p功能的效果(请参阅http://www.gigamonkeys.com/book/functions.html和http: //www.psg.com/~dlamkins/sl/chapter21.html了解详情和更多背景信息).
不,你不能直接知道这一点.
这是一个丑陋的解决方法,它依赖于默认参数可以是方法调用的事实.它带有许多警告,其中最大的一点就是它不是线程安全的.
private var usedDefault = false
private def default = {
usedDefault = true
1
}
def myMethod(x: Int = default) = {
if (usedDefault) {
println("default")
} else {
println("supplied")
}
usedDefault = false
}
Run Code Online (Sandbox Code Playgroud)
另一个更实用的解决方法是:
def myMethod(): Unit = myMethod(1, usedDefault = true)
def myMethod(x: Int): Unit = myMethod(x, usedDefault = false)
private def myMethod(x: Int, usedDefault: Boolean) = {
if (usedDefault) {
println("default")
} else {
println("supplied")
}
}
Run Code Online (Sandbox Code Playgroud)