Scala 试着不要一个完整的表情?
Try/catch可以像表达式一样使用,因此:Scala 试着不要一个完整的表情?,scala,try-catch,expression,Scala,Try Catch,Expression,Try/catch可以像表达式一样使用,因此: scala> try { 3 } catch {case _ => 0} res52: Int = 3 此外: scala> try { 3 } catch {case _ => 0} finally try {println("side effect")} catch { case _ => println("catching side effect") } side effect res50: Int =
scala> try { 3 } catch {case _ => 0}
res52: Int = 3
此外:
scala> try { 3 } catch {case _ => 0} finally try {println("side effect")} catch { case _ => println("catching side effect") }
side effect
res50: Int = 3
那么为什么不:
scala> try { 3 } catch {case _ => 0} + 4
<console>:1: error: ';' expected but identifier found.
try { 3 } catch {case _ => 0} + 4
当然,我可以将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 ...
}
}
但是,它不再是一个单一的表达式,我需要在另一个{}中进行包装,如果我错了,请纠正我的错误,这意味着在性能关键的地方,另一层函数对象包装,也称为间接
那么,有没有一种方法可以使用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
和往常一样,花括号和圆括号(大部分)是可以互换的——在我看来,有花括号的目标代码看起来会更好
不知道间接寻址——你需要看看编译的字节码——但我怀疑它会有什么不同
有关语法问题的完整解释(这并不是我最初认为的运算符优先级问题),请参见:
{}
不创建函数;这只是为了逻辑分组。如果恰好需要一个函数,那么{}
可以将函数体中的内容分组。因此valx={{{{{{“fish”}}
没有函数包装,而Option(-5.0)map math.abs
有一个。try
块确实是表达式,但并非所有表达式都相等。有关更多信息,请参阅的公认答案。简言之,像if
、match
和try
这样的块必须用括号括起来,才能被视为“完整的”表达式。@RexKerr:好的,谢谢。很高兴知道,谢谢。你能解释一下什么是运算符优先级问题,为什么会出现在这里吗?正确的英语应该是“运算符优先级”——但这不是真正的解释。我现在编辑。
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 ...
}
}
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