2011-10-05 110 views
3

是否有可能知道默认参数是否作为实际参数值提供?换句话说,假设我所定义的方法:是否有可能知道在Scala中是否提供了默认参数作为实际参数值(当它们相等时)?

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

然后是有可能这两个调用(其返回相同的结果之间进行区分,因为在第二个方法调用的参数具有相同的值作为默认值方法定义)方法体中:

myMethod() 
myMethod(1) 

换句话说,我想知道是否有技术来实现类似于-supplied-p功能Common Lisp中函数定义的效果(见http://www.gigamonkeys.com/book/functions.htmlhttp://www.psg.com/~dlamkins/sl/chapter21.html的细节和更多的上下文)。

回答

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

如果你有少量的参数,你总是可以重载的功能,使

def myMethod(x: Int) = x + 1 
def myMethod() = myMethod(1) 
相关问题