2012-07-18 3 views
2

나는 셰이프가없는 라이브러리에서 가능할 수 있다고 생각합니다.비동기 익명 클래스를 함수로 바꾸기

나는 무명 클래스를 클로저로 변환하기 위해 무형 속성을 사용하고 있습니다. 이 경우 FnHListerAux 특성의 hlisted을 사용해야합니다.

내가 원하는 것은 전달 된 더미 함수를 없애고 F과 같은 형식 서명을 가진이 함수를 닫는 것입니다. 비동기식으로 실행되는 익명 클래스가 없으면 쉽게 수행 할 수 있습니다. 이 문제를 해결할 방법이 있습니까?

def async[F, A <: HList, R](
    shell: Shell, 
    success: F, 
    failure: FunctionTypes.Failure, 
    dummy: F)(implicit h: FnHListerAux[F, A => R], 
      u: FnUnHListerAux[A => R, F]): F = 
{ (args: A) => 

    require(shell != null, "Shell cannot be null") 
    require(shell.getDisplay() != null, "The shell must have a display") 

    val display = shell.getDisplay() 
    display.asyncExec(new Runnable() { 
    def run(): Unit = { 
     try { 
     success.hlisted(args) 
     } catch { 
     case e: Throwable => 
      failure(e) 
     } 
    } 
    }) 

    dummy.hlisted(args) 
}.unhlisted 
+0

그런 무의미한 물건이 필요한 경우 알고리즘에 심각한 문제가 있어야합니다. 필요한 것을 설명해보십시오. –

+0

물론, 좋은 생각 일 것입니다. 나는 스칼라에 대해 아주 새롭다. 나는 아직도 당신이 실제로 함수의 몸체를 대체 할 수 있는지 궁금하다. 그러나 나의 실제 문제에 대한 해결책은 내 지식 수준보다 높은 무형의 라이브러리에 놓여있을 가능성이 높습니다. 그리고 나는 여전히 그 본성을 이해하려고 노력하고 있습니다. – Hakkar

답변

3

조금 단순화하는 것으로 시작하겠습니다. 기능이 있다고 가정하면 f입니다. 나는 그것이 진실임을 미리 알지 못한다. 그리고 나는 그것이 무엇을 반환하는지 신경 쓰지 않는다. 그걸 몇 가지 기능으로 포장하고 동일한 인수 유형을 가진 함수를 얻고 싶습니다. 나는 또한이 결과 함수가 무엇을 반환하는지 신경 쓰지 않아서, Unit을 반환 할 수도있다.

당신은 다음과 같은 기능의 무리 (물론, 22) 작성할 수

def wrap[A](f: A => Unit): A => Unit = ??? 
def wrap[A, B](f: (A, B) => Unit): (A, B) => Unit = ??? 
def wrap[A, B, C](f: (A, B, C) => Unit): (A, B, C) => Unit = ??? 

을하지만 싶지 않아.

def wrap[F, A <: HList](f: F)(
    implicit h: FnHListerAux[F, A => Unit], u: FnUnHListerAux[A => Unit, F] 
): F = { (args: A) => 
    println("Before!"); f.hlisted(args); println("After!") 
}.unhlisted 

우리에게 제공합니다 :

볼품은 확실히 더 일반적으로이 문제를 해결하는 데 도움을 줄 수

scala> def f(i: Int, s: String) { println(s * i) } 
f: (i: Int, s: String)Unit 

scala> val wf = wrap(f _) 
wf: (Int, String) => Unit = <function2> 

scala> wf(3, "ab") 
Before! 
ababab 
After! 

모든 때문에, fUnit보다 다른 뭔가를 반환 할 수 있으며,이 여전히 작동한다고 주 스칼라의 경우 Unit이고 FunctionN 형은 반환 유형이 공변입니다.

코드에이 방법을 적용하면, 우리는 다음과 같은 얻을 : 없음 dummy가 필요하지

def async[F, A <: HList](
    shell: Shell, success: F, failure: FunctionTypes.Failure 
)(
    implicit h: FnHListerAux[F, A => Unit], u: FnUnHListerAux[A => Unit, F] 
): F = { (args: A) => 
    require(shell != null, "Shell cannot be null") 
    require(shell.getDisplay() != null, "The shell must have a display") 

    val display = shell.getDisplay() 
    display.asyncExec(new Runnable() { 
    def run(): Unit = { 
     try { 
     success.hlisted(args) 
     } catch { 
     case e: Throwable => 
      failure(e) 
     } 
    } 
    }) 
}.unhlisted 

.

+0

다시 감사드립니다. Travis :) – Hakkar

관련 문제