在Scala中,可以让匿名函数有默认参数吗?

问题描述 投票:0回答:4

这有效:

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.
scala anonymous-function
4个回答
19
投票

无聊的正确答案是不,你不能,但实际上你可以,通过 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

这并不完全是您所要求的语法,并且不能保证这将永远处于实验状态,即使它确实如此,也可能不支持默认参数 - 但我仍然认为它现在可以工作非常整洁。


9
投票

扩展特拉维斯·布朗的回答中的“无聊、正确的答案是否定的”:

函数(即

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


1
投票

我认为这是有点肮脏的解决方案,使用柯里化

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

0
投票

我不知道,这是否有用:

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
© www.soinside.com 2019 - 2024. All rights reserved.