2009-10-30 17 views
2

試驗斯卡拉...我試圖定義類似於PHP中的「@」破解(這意味着,在以下語句中忽略任何異常)。更好的Scala匿名函數的語法?

我設法得到一個可行的定義:

 
    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

您沒有使用功能的參數,「副名」參數就可以了:

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

ignoreException(someExceptionThrowingCodeHere()) 

Eric。

+1

注意調用代碼可以在相同的風格寫亞歷克斯 - [R顯示了用戶使用例如:ignoreException {胡說(); blah()} – 2009-10-30 02:27:59