是否有可能知道在Scala中是否提供了默认参数作为实际参数值(当它们相等时)?

Emr*_*inç 3 scala

是否可以知道默认参数是否作为实际参数值提供?换句话说,假设我定义了一个方法:

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.htmlhttp: //www.psg.com/~dlamkins/sl/chapter21.html了解详情和更多背景信息).

Jea*_*let 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
}
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)