Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 试着不要一个完整的表情?_Scala_Try Catch_Expression - Fatal编程技术网

Scala 试着不要一个完整的表情?

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 =

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 = 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