2016-07-04 9 views
0

次のようなScalaコードの例がありますか?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

あなたはこのために名前によるパラメータを使用することができます。

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> 
+0

いいですが、私はそれが私が望んでいたものではありません。私は明確にするために私の質問にいくつかのメモを追加しました。 –

+0

コードブロックのクロージャーへの変換を行うには不器用な方法もあります。なぜなら、これは最終的に私が何を意味するのか知っていれば暗黙の変換によって行われるからです。 –

+1

@GerhardHagererうん、わかった。そのようなコードの使用例を表示できますか? –

関連する問題