2009-10-30 2 views
2

스칼라로 실험 ... PHP에서 "@"해킹과 비슷한 것을 정의하려고합니다. 즉, 다음 문장에서 예외를 무시하십시오.스칼라 익명 함수에 대한 더 나은 구문은 무엇입니까?

 
    def ignoreException(f:() => Unit) = { 
     try { 
     f(); 
     } 
     catch { 
     case e: Exception => println("exception ignored: " + e); 
     } 
    } 

을 그리고 다음과 같이 사용 :

내가 일하는 정의를 얻을 수 있었다 지금 여기

 
ignoreException(() => { someExceptionThrowingCodeHere() }); 

을 내 질문은 ... 거기 어쨌든 내가 사용을 단순화 할 수 있으며,() => 제거하고, 대괄호를 제거 하시겠습니까? 당신은 당신의 매개 변수로 함수를 사용할 필요가 없습니다

 
`@` { someExceptionThrowingCodeHere(); } 

답변

12

@은 패턴 일치를 위해 스칼라에서 예약되었지만 @@을 수락 하시겠습니까?

scala> def @@(block: => Unit): Unit = try { 
    block 
} catch { 
    case e => printf("Exception ignored: %s%n", e) 
} 
$at$at: (=> Unit)Unit 

scala> @@ { 
    println("before exception") 
    throw new RuntimeException() 
    println("after exception") 
} 
before exception 
Exception ignored: java.lang.RuntimeException 

나는이 그러나

6

A가 "로 이름"매개 변수를 수행합니다 :

는 궁극적으로 나는 이런 식으로 뭔가로 사용을하고 싶습니다

def ignoreException(f: =>Unit) = { 
    try { 
    f 
    } 
    catch { 
    case e: Exception => println("exception ignored: " + e) 
    } 
} 

ignoreException(someExceptionThrowingCodeHere()) 

에릭.

+1

주 ☺하여 호출 코드 알렉스 R은 사용 예로서 보여 주었다 같은 스타일로 작성 될 수있는, 좋은 생각입니다 확신 아니에요 : ignoreException {ㅋ ㅋ(); 예()} –

관련 문제