Scala: определить параметры по умолчанию в функции (val) vs с помощью метода (def)
У меня есть следующий метод:
scala> def method_with_default(x: String = "default") = {x + "!"}
method_with_default: (x: String)java.lang.String
scala> method_with_default()
res5: java.lang.String = default!
scala> method_with_default("value")
res6: java.lang.String = value!
Я пытаюсь сделать то же самое с val, но получаю синтаксическую ошибку, например:
(без значения по умолчанию, этот компилируется нормально)
scala> val function_with_default = (x: String) => {x + "!"}
function_with_default: String => java.lang.String = <function1>
(но я не смог собрать этот компилятор...)
scala> val function_with_default = (x: String = "default") => {x + "!"}
<console>:1: error: ')' expected but '=' found.
val function_with_default = (x: String = "default") => {x + "!"}
^
любая идея?
Ответы
Ответ 1
Нет никакого способа сделать это. Лучшее, что вы можете получить, это объект, который расширяет как Function1
, так и Function0
, где метод apply Function0
вызывает другой метод apply с параметром по умолчанию.
val functionWithDefault = new Function1[String,String] with Function0[String] {
override def apply = apply("default")
override def apply(x:String) = x + "!"
}
Если вам нужны такие функции чаще, вы можете разложить метод применения по умолчанию в абстрактный класс DefaultFunction1
следующим образом:
val functionWithDefault = new DefaultFunction1[String,String]("default") {
override def apply(x:String) = x + "!"
}
abstract class DefaultFunction1[-A,+B](default:A)
extends Function1[A,B] with Function0[B] {
override def apply = apply(default)
}