Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:代码块可以转换为闭包吗?_Scala_Closures - Fatal编程技术网

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

Scala:代码块可以转换为闭包吗?,scala,closures,Scala,Closures,下面的Scala代码示例可能吗 { println("done!") }.asInstanceOf[() => Any] 实现这一目标最简单的方法是什么 Edit:我的目标是得到一个比()=>{…}更短的闭包表达式。我想去掉()=>部分 编辑2:为您提供一个小用例示例: implicit class Closure(func: () => Any) { def asRunnable = new Runnable { override def run() = func() }

下面的Scala代码示例可能吗

{ println("done!") }.asInstanceOf[() => Any]
实现这一目标最简单的方法是什么

Edit:我的目标是得到一个比()=>{…}更短的闭包表达式。我想去掉()=>部分

编辑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
那么:

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

val f2 : () => Any = () => println("done!") // with explicit type () => Any = <function0>
val f1=()=>println(“完成!”)/()=>Unit=
val f2:()=>Any=()=>println(“done!”)//带有显式类型()=>Any=
关于:

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

val f2 : () => Any = () => println("done!") // with explicit type () => Any = <function0>
val f1=()=>println(“完成!”)/()=>Unit=
val f2:()=>Any=()=>println(“done!”)//带有显式类型()=>Any=

您可以为此使用按名称参数:

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

block { println("done!") }
除非
不短于
()=>
,而且较短的名称不太清晰(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
不会启动新线程。

您可以为此使用按名称参数:

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

block { println("done!") }
除非
不短于
()=>
,而且较短的名称不太清晰(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
不会启动新线程。

不错,但我想这不是我想要的。我在我的问题中添加了一些注释以供澄清。实现代码块到闭包的转换的笨拙方法也可以,因为如果你知道我的意思,这最终可以通过某种隐式转换来完成。@Gerhardhager yea,我理解。你能展示一下这样的代码的使用示例吗?我在我的问题中添加了一个用例示例。很好,但我不知道这正是我想要的。我在我的问题中添加了一些注释以供澄清。实现代码块到闭包的转换的笨拙方法也可以,因为如果你知道我的意思,这最终可以通过某种隐式转换来完成。@Gerhardhager yea,我理解。你能展示一下这样的代码的使用示例吗?我在我的问题中添加了一个用例示例。