是否可以知道默认参数是否作为实际参数值提供?换句话说,假设我定义了一个方法:
def myMethod(x: Int = 1) = x + 1
然后是否可以区分这两个调用(返回相同的结果,因为第二个方法调用中的参数与方法定义中的默认值具有相同的值):
myMethod()
myMethod(1)
换句话说,我想知道是否有技术可以实现类似于Common Lisp函数定义中的 -supplied -p 特性的效果(参见http://www.gigamonkeys.com/book/functions.html和{{ 3}}以获取详细信息和更多上下文。)
答案 0 :(得分:7)
不,你不能直接知道这一点。
这是一个丑陋的解决方法,它依赖于默认参数可以是方法调用的事实。它带有许多警告,其中最大的一点就是它不是线程安全的。
private var usedDefault = false
private def default = {
usedDefault = true
1
}
def myMethod(x: Int = default) = {
if (usedDefault) {
println("default")
} else {
println("supplied")
}
usedDefault = false
}
另一个更实际的解决方法是:
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")
}
}
答案 1 :(得分:1)
如果你有少量参数,你可能总是重载你的功能,所以
def myMethod(x: Int) = x + 1
def myMethod() = myMethod(1)