抑制“已弃用的非Unit值”警告

50

我将 -Ywarn-value-discard 命令行参数添加到我的构建中,因为这将捕捉到我刚刚发现的代码中的一个微妙错误。然而,现在我会收到一些有关意图放弃而不是错误的警告,如“放弃非Unit值”的警告。我该如何禁止这些警告呢?

3个回答

69

你可以通过显式返回 unit (即 ()) 来抑制这些警告。

例如,将其转换为:

def method1() = {
   println("Hello")
   "Bye"
}
def method2() {
  method1() // Returns "Bye", which is implicitly discarded
}

进入:

def method1() = {
   println("Hello")
   "Bye"
}
def method2() {
  method1()
  () // Explicitly return unit
}

在调用method2中的method1时,您是否会丢弃非单元值? - botchniaque
2
第一个代码片段展示了一个情况,当启用-Ywarn-value-discard时会触发警告,因此在调用method2中的method1时,确实丢弃了非单元值(即method1的返回值)。第二个代码片段明确返回“unit”(换句话说是()),从而消除了警告。 - Régis Jean-Gilles

26

根据这个回答,你也可以使用语法val _

def method2(): Unit = {
  val _ = method1()
}

但是关于这个问题,是否采用 @Régis 的回答为首选风格存在一些争议。


1
method1() match { case _ => } 也可以接受吗? - Netsu
我在这个解决方案中遇到了问题,例如需要使用以下代码:val _ = rdd1.unpersist() 和下面的一行 val _ = rdd2.unpersist(),编译器会报告值 _ 已经被定义。 - Wonay
1
@Wonay:只有方法的最后一行需要这种处理,因此无需将其上面的行转换为赋值语句。更详细地说:-Ywarn-value-discard 不会仅仅因为忽略非 Unit 值而发出警告。在语言规范的 6.26.1 节 中定义的“值丢弃”是指一个值出现在期望为 Unit 的位置,例如作为方法的返回值。 - Todd Owen
啊,好的,我想这是因为我正在使用ScalaStyle中的那个。 - Wonay

8

现在您可以通过将类型指定为Unit来抑制值丢失警告,这在Scala 2.13中实现。

以下是一个示例:

def suppressValueDiscard(): Unit =
  "": Unit

1
@nafg 在Scala 2.13.2中,“:Unit”仍然可以抑制该警告。但是,这个特性在某些情况下不起作用,比如https://github.com/scala/scala/pull/7563#issuecomment-460419680。我猜你可能会遇到相同的情况,或者你只是发现了Scalac的一个错误。 - floating cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接