【问题标题】:Suppress "discarded non-Unit value" warning抑制“丢弃的非单位值”警告
【发布时间】:2019-10-24 17:30:41
【问题描述】:

我已将 scalac 命令行参数 -Ywarn-value-discard 添加到我的构建中,因为这会发现我刚刚在我的代码中发现的一个细微错误。但是,我现在收到一些关于“丢弃的非单位值”的警告,这些警告是关于故意丢弃的,而不是错误。如何抑制这些警告?

【问题讨论】:

    标签: scala compiler-warnings


    【解决方案1】:

    您通过显式返回单位(即())来抑制这些警告。 例如转这个:

    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 时不要丢弃非单位值吗?
    • 第一个 sn-p 说明了一个确实触发警告的情况(当-Ywarn-value-discard被启用时),所以在这种情况下确实是一个非单位值(在method2 中调用method1 时会丢弃method1) 的返回值。第二个 sn-p 显式返回“unit”(换句话说,()),从而消除了警告。
    【解决方案2】:

    根据this answer,也可以使用val _的语法,即

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

    但是对于这个或@Régis 的回答是否是首选风格存在一些争议。

    【讨论】:

    • method1() match { case _ => } 也可以接受吗?
    • 我对这个解决方案有疑问,例如:val _ = rdd1.unpersist() 和它下面的行 val _ = rdd2.unpersist() 编译器说值 _ 已经定义
    • @Wonay:只有方法的最后行需要这种处理,所以没有必要把它上面的行变成赋值。更详细地说:-Ywarn-value-discard 不会仅仅因为忽略非 Unit 值而发出警告。语言规范的section 6.26.1 中定义的“丢弃值”具体是关于出现在Unit 应为的值,例如作为方法的返回值。
    • 啊,好吧,我想是因为我使用的是 ScalaStyle 的那个
    【解决方案3】:

    现在您可以通过在Scala 2.13 中对Unit 的类型归属来抑制值丢弃警告。

    这是一个例子:

    def suppressValueDiscard(): Unit =
      "": Unit
    

    【讨论】:

    • @nafg : Unit 仍然可以在 Scala 2.13.2 中抑制该警告。但是这个功能在某些情况下不起作用,比如github.com/scala/scala/pull/7563#issuecomment-460419680。我猜你可能会遇到同样的情况,或者你只是在 Scalac 中发现了一个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2017-04-04
    • 2021-02-19
    相关资源
    最近更新 更多