调用匿名闭包

vir*_*yes 3 closures scala anonymous invoke

编辑
确定,这里的反馈非常好,让我指出了正确的方向.用于调用匿名闭包的用例位于Scalatra路由层中.我有一堆在不同类型下组合在一起的路由,在本例中,是团队共同的请求:

class Router {
  type TeamType <: _Controller with _Team

  get("""(schedules|rosters|teamresults|teamstats)/\d{8}""".r) {
    val clazz :: date = captures

    val obj = (clazz match {
      case "schedules" => new RosterController
      case "rosters" => new ScheduleController
    }).asInstanceOf[TeamType]

    obj.show(date)
  }
}
Run Code Online (Sandbox Code Playgroud)

通过将匹配表达式包装在一个自调用的匿名闭包中,我们避免在每个匹配的情况下添加"FooController.asInstanceOf [TeamType]",而是在返回的实例上执行类型转换,在过程中保持不变性(即不能" val obj = clazz match {...}"后跟类型cast as obj已经被val'd了)

我相信这是在基于字符串类名创建对象实例时可以获得的短格式.当然,这样说,可能有一种FP方法可以更加简洁地完成工作......

无论如何,很酷的东西,从Groovy缺少匿名闭包,现在我发现Scala也包括在内;-)

原始
不知道如何在Scala中解决这个问题.在Groovy中,您可以定义和调用匿名闭包,如下所示:

{String s-> println(s) }("hello")
Run Code Online (Sandbox Code Playgroud)

Scala中的等价物是什么?而且,如何指定返回类型而不是返回Unit?

谢谢

Fre*_*Foo 7

((s : String) => println(s))("hello")
Run Code Online (Sandbox Code Playgroud)

至于返回类型,让Scala推断它.

scala> ((x : Int) => x < 4)(3)
res0: Boolean = true
Run Code Online (Sandbox Code Playgroud)

  • @virtualeyes,这是你如何指定参数类型和返回类型:`({s => println(s)}:String => Unit)apply"hello"`. (2认同)
  • 您可以通过在最后一个值上声明返回类型来获得显式返回类型,例如`((s:String)=> println(s):Any)("hello")`或者通过声明整个函数的类型,例如`((s => println(s)):( String => Any))("hello")` (2认同)