我有这段代码,在 Scala 2 中可以正常编译:
object TareaRima {
private def guardaEnHistorico(det: JobDetail, exito: Boolean, texto: String, mime: String, tmp: Long): Unit = {
// escribir histórico en la traza
try {
val txt =
if (texto == null || texto.isEmpty) "_"
else if (texto.length > 3000) texto.substring(0, 3000)
val mimeVal =
if (mime == null || mime.isEmpty) "?"
else mime
val isExito = if (exito) "S" else "N"
val tmpVal = tmp.toString
val formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss")
val msj = det.getGroup + " -- " + det.getName + " -- " + formatter.format(
new Date,
) + " -- " + isExito + " " + tmpVal + " -- " + txt + " -- " + mimeVal
traza info msj
} catch {
case NonFatal(ex) =>
traza.warn("Error al guardar a historico", ex)
}
}
...
}
针对 Scala 3 进行编译时,我收到此警告:
A pure expression does nothing in statement position; you may be omitting necessary parentheses
if (texto == null || texto.isEmpty) "_"
我重新检查了代码,发现没问题。 我想这一定不是Scala 3的bug,因为它现在已经相当成熟了。 我尝试过使用括号,但没有成功:
val txt = (
if (texto == null || texto.isEmpty) "_"
else if (texto.length > 3000) texto.substring(0, 3000)
)
我还尝试重新缩进警告周围的所有内容。
val txt = (
if (texto == null || texto.isEmpty) "_"
else if (texto.length > 3000) texto.substring(0, 3000)
)
不存在
else texto
,因此 if (texto.length > 3000) texto.substring(0, 3000)
解析为 Unit
。 (然后 txt
变成 String | Unit
并且可能升级为 Any
)。
既然决定了
Unit
,有点像
// this whole block is Unit
if (cond) {
statements
}
在这种情况下,Scala 会检查您可能不小心忽略的
Unit
中实际上没有未使用的非 if
值。恕我直言,你有。