迁移到 Scala 3 后,我收到此警告:纯表达式在语句位置不执行任何操作

问题描述 投票:0回答:1

我有这段代码,在 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)
      )

我还尝试重新缩进警告周围的所有内容。

scala migration scala-3
1个回答
0
投票
      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
值。恕我直言,你有。

© www.soinside.com 2019 - 2024. All rights reserved.