ib8*_*b84 2 expression scala try-catch
Try/catches可以像表达式一样使用,因此:
scala> try { 3 } catch {case _ => 0}
res52: Int = 3
Run Code Online (Sandbox Code Playgroud)
也:
scala> try { 3 } catch {case _ => 0} finally try {println("side effect")} catch { case _ => println("catching side effect") }
side effect
res50: Int = 3
Run Code Online (Sandbox Code Playgroud)
那么为什么不呢:
scala> try { 3 } catch {case _ => 0} + 4
<console>:1: error: ';' expected but identifier found.
try { 3 } catch {case _ => 0} + 4
Run Code Online (Sandbox Code Playgroud)
或者为什么不:
scala> try { 3 } catch {case _ => 0} match {case 3 => "hi"}
<console>:1: error: ';' expected but 'match' found.
try { 3 } catch {case _ => 0} match {case 3 => "hi"}
Run Code Online (Sandbox Code Playgroud)
我的目标是这样的函数定义:
def transact[T](code : Unit => T):T =
try {startTransaction; Right(code)}
catch {case t:Throwable => Left(t)}
finally try {endTransaction}
catch { case e:... if ... => throw e}
match {
case Right(e) => e
case Left....
}
Run Code Online (Sandbox Code Playgroud)
当然我可以将try/catch存储在val中并匹配val:
def transact[T](code : Unit => T):T =
{
val transa = try {startTransaction; Right(code)}
catch {case t:Throwable => Left(t)}
finally try {endTransaction}
catch { case e:... if ... => throw e}
transa match {
case ...
}
}
Run Code Online (Sandbox Code Playgroud)
但是它不再是一个单独的表达式,而且我需要包含另一个{},如果我错了,请指导我 - 意味着在性能关键位置另一层功能对象包装又间接.
那么,有没有办法使用try作为完整表达式并避免这种间接?
谢谢
这是一个scala语法问题 - 只需添加括号即可将try/catch块转换为SimpleExpr,以便继续对其进行操作:
scala> (try { 3 } catch {case _ => 0}) + 4
res1: Int = 7
scala> (try { 3 } catch {case _ => 0}) match {case 3 => "hi"}
res2: java.lang.String = hi
Run Code Online (Sandbox Code Playgroud)
像往常一样,卷曲和圆括号(大多数)可以互换 - 你的目标代码看起来更好(imo)用大括号.
不知道间接 - 你需要查看编译后的字节码 - 但我怀疑它会有所作为.
有关语法问题的完整说明(这不是我最初认为的运算符优先级问题),请参阅:https://stackoverflow.com/a/7530565/178551
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |