2016-07-04 2 views
0

다음과 같은 스칼라 코드 예제가 가능합니까?스칼라 : 코드 블록을 클로저로 변환 할 수 있습니까?

{ 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은보다 작지 않습니다. 0이고 더 짧은 이름은 명확하지 않습니다 (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 네, 이해합니다. 그러한 코드의 사용 예를 보여줄 수 있습니까? –

관련 문제