这有效:
scala> def test(name: String = "joe"): Boolean = true
test: (name: String)Boolean
我希望这能以同样的方式工作:
scala> val test: String => Boolean = { (name: String = "joe") => true }
console>:1: error: ')' expected but '=' found.
无聊的正确答案是不,你不能,但实际上你可以,通过 2.11 中的实验性单一抽象方法 (SAM) 合成。
首先,您需要使用
apply
方法参数的默认值定义自己的 SAM 类型:
trait Func {
def apply(name: String = "joe"): Boolean
}
现在您可以使用函数文字表示法来定义
Func
(请注意,您需要使用 -Xexperimental
启动 REPL 才能执行此步骤):
val f: Func = { (name: String) => name == "joe" }
或者只是:
val f: Func = _ == "joe"
然后是平常的事情:
scala> f("joe")
res0: Boolean = true
scala> f("eoj")
res1: Boolean = false
还有妙语:
scala> f()
res2: Boolean = true
这并不完全是您所要求的语法,并且不能保证这将永远处于实验状态,即使它确实如此,也可能不支持默认参数 - 但我仍然认为它现在可以工作非常整洁。
扩展特拉维斯·布朗的回答中的“无聊、正确的答案是否定的”:
函数(即
FunctionN[...]
类型的对象)在 Scala 中不能有默认参数,只有方法可以。由于匿名函数表达式生成函数(而不是方法),因此它们不能有默认参数。
我认为这是有点肮脏的解决方案,使用柯里化
def testDef(nameDef: String)(name2: String): Boolean = {
val name3 = if ( name2 != "") name2 else nameDef
//use name3 for your logic
true
}
//> testDef: (name: String)(name2: String)Boolean
柯里化 testDef 方法以保持默认值,如下所示。
var test = test("joe")_ //> test : String => Boolean=function1
test("fun") //"fun" will be used as name3
test("") // "joe" will be used as name3
我不知道,这是否有用:
trait Printer {
def apply(message: String = "Warning: The message argument is empty!"): Unit
}
val console: Printer = (message: String) => println(message)
console("Hello World!") // Hello World!
console() // Warning: The message argument is empty