Scala中try/catch代码块内元组赋值失效问题
为什么Scala的try块里不能直接用元组解构赋值?
这确实是Scala语法里一个容易踩的细节坑!你遇到的问题本质是Scala对try代码块的语法要求和普通代码块不同。
问题根源
Scala中,try { ... }的花括号内部必须是一个表达式(能返回某个值的代码),而(a, b) = my_function(input)这种元组解构赋值,本质上是一个语句(返回Unit的赋值操作)——虽然它在顶层代码或者普通的{}块里可以正常运行,但不符合try块对表达式的要求,所以编译器会报错。
而你用临时变量中转的写法,val tmp = my_function(input); a = tmp._1; b = tmp._2,整个代码块是一个合法的表达式(最后一行赋值语句返回Unit),所以能顺利通过编译。
解决方案
除了你已经用到的临时变量法,还有两种更简洁的写法:
1. 把解构赋值包在内部代码块里
用内层{}把解构赋值语句转为表达式,满足try块的语法要求:
var a = 0 var b = 0 try { { (a, b) = my_function(input) } } catch { case e: Exception => println("Exception caught: " + e) }
2. 用模式匹配替代直接解构
这也是Scala推荐的风格之一,通过模式匹配完成赋值,天然符合表达式要求:
var a = 0 var b = 0 try { my_function(input) match { case (x, y) => a = x b = y } } catch { case e: Exception => println("Exception caught: " + e) }
补充说明
其实不止try块,在其他要求表达式的场景(比如if分支的主体、for推导式的每一步),直接用解构赋值语句都会遇到类似问题,这时候用代码块包裹或者转成模式匹配就能轻松解决。
内容的提问来源于stack exchange,提问作者belka
相关产品推荐
相关产品推荐

