Scala:代码块可以转换为闭包吗?

时间:2016-07-04 08:27:35

标签: scala closures

是否可以使用以下Scala代码示例?

{ println("done!") }.asInstanceOf[() => Any]

实现这一目标的最简洁方法是什么?

编辑:我的目标是获得一个更短的闭包表达式而不是()=> {...}。我想摆脱()=> 部分。

编辑2:为您提供一些用例示例:

implicit class Closure(func: () => Any) {
  def asRunnable = new Runnable { override def run() = func() }
  def asThread   = new Thread(asRunnable)
  def run        = asThread.start()
}
(() => println("something")).run

2 个答案:

答案 0 :(得分:2)

怎么样:

val f1 = () => println("done!") // () => Unit = <function0>

val f2 : () => Any = () => println("done!") // with explicit type () => Any = <function0>

答案 1 :(得分:2)

您可以使用名字参数:

def block[A](f: => A): () => A = () => f

block { println("done!") }

block不短于() =>且较短的名称不太清楚(IMO)。

您的用例将变为

implicit class Closure(func: => Any) {
  def asRunnable = new Runnable { override def run() = func }
  def asThread   = new Thread(asRunnable)
  def run        = asThread.start()
}

当然,如果块的类型已经具有您调用的方法,则不会应用转换!例如。 { new Runnable { def run() = ... } }.run将无法启动新主题。