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

时间:2011-10-05 13:53:41

标签: scala

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

def myMethod(x: Int = 1) = x + 1

然后是否可以区分这两个调用(返回相同的结果,因为第二个方法调用中的参数与方法定义中的默认值具有相同的值):

myMethod()
myMethod(1)

换句话说,我想知道是否有技术可以实现类似于Common Lisp函数定义中的 -supplied -p 特性的效果(参见http://www.gigamonkeys.com/book/functions.html和{{ 3}}以获取详细信息和更多上下文。)

2 个答案:

答案 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)