【发布时间】:2019-10-24 17:30:41
【问题描述】:
我已将 scalac 命令行参数 -Ywarn-value-discard 添加到我的构建中,因为这会发现我刚刚在我的代码中发现的一个细微错误。但是,我现在收到一些关于“丢弃的非单位值”的警告,这些警告是关于故意丢弃的,而不是错误。如何抑制这些警告?
【问题讨论】:
我已将 scalac 命令行参数 -Ywarn-value-discard 添加到我的构建中,因为这会发现我刚刚在我的代码中发现的一个细微错误。但是,我现在收到一些关于“丢弃的非单位值”的警告,这些警告是关于故意丢弃的,而不是错误。如何抑制这些警告?
【问题讨论】:
您通过显式返回单位(即())来抑制这些警告。
例如转这个:
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 时不要丢弃非单位值吗?
-Ywarn-value-discard被启用时),所以在这种情况下确实是一个非单位值(在method2 中调用method1 时会丢弃method1) 的返回值。第二个 sn-p 显式返回“unit”(换句话说,()),从而消除了警告。
根据this answer,也可以使用val _的语法,即
def method2(): Unit = {
val _ = method1()
}
但是对于这个或@Régis 的回答是否是首选风格存在一些争议。
【讨论】:
method1() match { case _ => } 也可以接受吗?
val _ = rdd1.unpersist() 和它下面的行 val _ = rdd2.unpersist() 编译器说值 _ 已经定义
-Ywarn-value-discard 不会仅仅因为忽略非 Unit 值而发出警告。语言规范的section 6.26.1 中定义的“丢弃值”具体是关于出现在Unit 应为的值,例如作为方法的返回值。
【讨论】:
: Unit 仍然可以在 Scala 2.13.2 中抑制该警告。但是这个功能在某些情况下不起作用,比如github.com/scala/scala/pull/7563#issuecomment-460419680。我猜你可能会遇到同样的情况,或者你只是在 Scalac 中发现了一个错误。