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

时间:2014-08-11 01:31:32

标签: 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.

3 个答案:

答案 0 :(得分:16)

无聊,正确的答案是否定的,你不能,但实际上你可以用2.11中的实验single abstract method (SAM) synthesis

首先,您需要使用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

这并不是你所要求的语法,并且没有任何承诺,这将永远留下实验状态,即使它确实如此,也可能不支持默认参数 - 但我仍然认为它很有效现在

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

我认为这是一个有点脏的解决方案,使用currying

def testDef(nameDef: String)(name2: String): Boolean = { val name3 = if ( name2 != "") name2 else nameDef //use name3 for your logic true } //&GT; testDef :( name:String)(name2:String)布尔值

将testDef方法设置为保持默认值,如下所示。

var test = test("joe")_ //&gt; test:String =&gt;布尔=功能1

test("fun") //&#34;有趣&#34;将用作名称3 test("") //&#34;乔&#34;将用作name3