-Ywarn-value-discard
该值不会被丢弃,它被分配给val
! 问题val
是未使用
带代码:
package foo
case class Foo(x: Int) {
def foo: Int = {
val y = 2;
x
}
}
我得到了 scalac 2.11.5 和-Ywarn-unused
:
[warn] /.../foo.scala:5: local val in method foo is never used
[warn] val y = 2;
-Ywarn-dead-code
编写常见逻辑不起作用的反例很容易:
// Evil mutable class
class Arrayish {
private var x: Int = 100
def length(): Int = {
val res = x
x += 1
res
}
}
def test(nums: Arrayish): Unit =
if (nums.length == 100) {
println( "should be printed" )
if (nums.length != 100) {
println("Dead code, so should be warned against")
}
}
运行死代码:
scala> test(new Arrayish())
should be printed
Dead code, so should be warned against
或者
class NonEqual {
def ==(x: Int): Boolean = true
def !=(x: Int): Boolean = true
}
class NaNLength {
val length: NonEqual = new NonEqual
}
def test2(nums: NaNLength): Unit =
if (nums.length == 100) {
println("should be printed")
if (nums.length != 100) {
println("Dead code, so should be warned against")
}
}
死代码也运行:
scala> test2(new NaNLength)
should be printed
Dead code, so should be warned against
Scalac 编译器不够聪明,无法区分表现良好和表现不佳的情况。
如果您要提交错误/功能请求,请提及以下示例:
def test3(nums: Array[Int]): Unit = {
if (true) {
println("should be printed")
if (false) {
println("Dead code, so should be warned against")
}
}
}
def test4(nums: Array[Int]): Unit = {
val hundred = nums.length == 100
if (hundred) {
println("should be printed")
if (!hundred) {
println("Dead code, so should be warned against")
}
}
}
似乎 scalac 死代码报告器不像 Java 那样优美。我希望 scalac 确实优化了这些示例,但它不应该太复杂。