gpt4 book ai didi

scala Ywarn-all 用法

转载 作者:行者123 更新时间:2023-12-02 00:41:55 26 4
gpt4 key购买 nike

我正在尝试使用 scala 编译器 Y 警告,但我认为我做得不对。在下面的示例中,nums 未使用,因此我希望 -Ywarn-value-discard 打印一个警告。有两个 if 条件,一个嵌套在另一个内。 child if 的条件与 parent 的完全相反,因此其中的任何内容都是死代码。但 -Ywarn-dead-code 不会对此发出警告。谁能建议我可能做错了什么?任何指示将不胜感激。

object DeadCodeWarn{
def main( args: Array[ String ] ) {
val nums = 1 to 100
//There should be a warning for squares
//as its a non-unit expression thats not
//used in any computation. Y-warn-value-discard
val squares = nums.map( x => x * x )

if( nums.length == 100 ){
println( "should be printed" )
if( nums.length !=100 )
{
//-Ywarn-dead-code
println( "Dead code, so should be warned against" )
}
}
}
}

$scalac -Xlint -Ywarn-all DeadCodeWarn.scala 默默地成功。

最佳答案

-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 能够正确优化这些示例,但它不应该太复杂。

关于scala Ywarn-all 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com