在Scala中,你能否使一个匿名函数有一个默认参数?

Cha*_*ler 7 scala anonymous-function

这有效:
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.

Tra*_*own 16

无聊,正确的答案是否定的,你不能,但实际上你可以用2.11中的实验单抽象方法(SAM)合成.

首先,您需要使用apply方法参数的默认值定义自己的SAM类型:

trait Func {
  def apply(name: String = "joe"): Boolean
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用函数文字表示法来定义Func(请注意,您需要启动REPL -Xexperimental才能使此步骤起作用):

val f: Func = { (name: String) => name == "joe" }
Run Code Online (Sandbox Code Playgroud)

要不就:

val f: Func = _ == "joe"
Run Code Online (Sandbox Code Playgroud)

通常的东西:

scala> f("joe")
res0: Boolean = true

scala> f("eoj")
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)

和妙语:

scala> f()
res2: Boolean = true
Run Code Online (Sandbox Code Playgroud)

它并不完全是你要求的语法,并且没有任何承诺可以保留实验状态,即使它确实存在,也可能不支持默认参数 - 但我仍然认为它现在很有效.


Ale*_*nov 6

在Travis Brown的答案中扩展"无聊,正确答案是否定的":

函数(即FunctionN[...]类型的对象)在Scala中不能有默认参数,只有方法才能.由于匿名函数表达式生成函数(而不是方法),因此它们不能具有默认参数.