gpt4 book ai didi

scala - 尝试不完整的表达?

转载 作者:行者123 更新时间:2023-12-02 07:38:51 25 4
gpt4 key购买 nike

try/catches 可以像表达式一样使用,所以:

 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

或者为什么不:

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"}

我的目标是这样的函数定义:

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....
}

当然,我可以将 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 block 转换为 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

像往常一样,大括号和圆括号(大部分)是可以互换的——你的目标代码使用大括号看起来会更好(imo)。

不知道间接寻址——你需要查看编译后的字节码——但我怀疑它会有所作为。

有关语法问题的完整解释(这不完全是我最初认为的运算符优先级问题),请参阅:https://stackoverflow.com/a/7530565/178551

关于scala - 尝试不完整的表达?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com