我已经定义了两个部分函数(散列),我期望它采用可选的第二个布尔参数:
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")
我只是重构了这个以使用部分函数,在重构之前我可以强制哈希函数使用默认值而没有任何问题。
为什么部分函数实现无法允许默认参数的任何想法?我是否在使用部分功能和一起讨论时做错了什么?
答案 0 :(得分:4)
使用部分应用程序生成函数时,您将无法调用默认值。方法是静态的,因此编译器知道在哪里查找默认值;函数可以传递到不同的上下文中,因此编译器通常不会具有应用默认参数所需的信息。
以另一种方式思考,函数只知道它们有多少参数。只有一种方法apply
,您可以将参数传递给;否则你需要某种方式(不同的类型,大概是)来区分,例如,功能2 - 必须采取两个参数和功能2 - 可以被称为一个参数 - 也 - 因为-there-是-A-存储缺省。