【问题标题】:Scala: Can a code block be converted to a closure?Scala:可以将代码块转换为闭包吗?
【发布时间】:2016-07-04 08:27:34
【问题描述】:

是否可能类似于以下 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

【问题讨论】:

    标签: scala closures


    【解决方案1】:

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

    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 不会启动新线程。

    【讨论】:

      【解决方案2】:

      怎么样:

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

      【讨论】:

      • 很好,但这并不是我想要的。我在我的问题中添加了一些注释以供澄清。
      • 实现将代码块转换为闭包的笨拙方法也可以,因为如果您知道我的意思,这最终可以通过一些隐式转换来完成。
      • @GerhardHagerer 是的,我明白了。你能展示一个这样的代码使用示例吗?
      • 我在我的问题中添加了一个用例示例。
      猜你喜欢
      • 1970-01-01
      • 2012-04-10
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多