我定义了两个部分函数(hashes),我希望它采用可选的第二个布尔参数:
def SHA1 = hash(MessageDigest.getInstance("SHA-1"))_
def MD5 = hash(MessageDigest.getInstance("MD5"))_
private def hash(algorithm:HashAlgorithm)(s:String, urlencode:Boolean = false) = {
val form = if (urlencode) "%%%02X" else "%02X"
(algorithm.digest(s.getBytes) map(form format _)).mkString
}
当我用两个参数调用函数时,它会编译,但只使用一个参数,我会得到一个编译错误:
// First 3 tests are fine
val test1 = hash(MessageDigest.getInstance("SHA-1"))("foo", true)
val test2 = hash(MessageDigest.getInstance("SHA-1"))("foo")
val test3 = SHA1("foo", true)
// not enough arguments for method apply: (v1: String, v2: Boolean)String in trait Function2. Unspecified value parameter v2.
val test4 = SHA1("foo")
我只是将其重构为使用分部函数,在重构之前,我可以强制哈希函数使用默认值,而不会出现任何问题。
为什么分部函数实现不允许默认参数?同时使用偏函数和currying是否出错?
当您使用部分应用程序生成函数时,您将失去调用默认值的能力。方法是静态的,所以编译器知道在哪里查找默认值;一个函数可以传递到不同的上下文中,因此编译器通常不会获得应用默认参数所需的信息。
换句话说,函数只知道它们有多少个参数。只有一个方法apply
可以将参数传递到其中;否则,您将需要某种方式(可能是不同的类型)来区分,例如,必须使用两个参数的Function2和不使用任何参数也可以调用的Function2。