2009-10-30 52 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