Могу ли я применить аргументы по умолчанию при использовании частичных функций в Scala
Я определил две частичные функции (хэши), которые я ожидаю принять необязательный второй логический параметр:
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")
Я просто реорганизовал это, чтобы использовать частичные функции, и, прежде чем рефакторинг, я мог заставить хэш-функцию использовать значение по умолчанию без каких-либо проблем.
Любые идеи, почему реализация частичной функции не позволяет аргументы по умолчанию? Я делаю что-то не так, используя как частичные функции, так и карри?
1 ответ
Когда вы используете частичное приложение для генерации функции, вы теряете возможность вызывать значение по умолчанию. Метод - это статическая вещь, поэтому компилятор знает, где искать значение по умолчанию; функцию можно передавать в разные контексты, поэтому компилятор, как правило, не будет иметь информации, необходимой для применения параметра по умолчанию.
Чтобы думать об этом иначе, функции знают только, сколько аргументов у них есть. Есть только один метод, apply
, что вы передаете параметры в; в противном случае вам понадобится какой-то способ (предположительно, различных типов), чтобы различать, например, Function2-that-must-take-two-parameters и Function2-that-can-be-call-with-one-parameter-Кроме-также-потому что -есть-это-запасенной по умолчанию.