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