Scala 2.12告诉我不赞成使用Stack,如何完全替换它(以及为什么我在IntelliJ中看不到正确的警告)

提马秀

我设置了一个Scala项目,并从http://www.scalatest.org/添加了此代码段

import collection.mutable.Stack
import org.scalatest._

class ExampleSpec extends FlatSpec with Matchers {

  "A Stack" should "pop values in last-in-first-out order" in {
    val stack = new Stack[Int]
    stack.push(1)
    stack.push(2)
    stack.pop() should be (2)
    stack.pop() should be (1)
  }

  it should "throw NoSuchElementException if an empty stack is popped" in {
    val emptyStack = new Stack[Int]
    a [NoSuchElementException] should be thrownBy {
      emptyStack.pop()
    } 
  }
}

并且IntelliJ(IDEA 2017.1.2)向我显示有关以下用途的警告new Stack[Int]

在此处输入图片说明

搜索警告向我显示了此问题:https : //issues.scala-lang.org/browse/SI-9068

但是我仍然有这些问题:

  1. 我得到一个弹出窗口,分为两个区域。这是否意味着有两个警告,每个警告有两行。什么是真实信息?对于第二个区域,我看到“参考”必须带有前缀并且正在构建中

  2. 为什么我看不到适当的已弃用警告,例如在此处添加的警告:https : //github.com/scala/scala/pull/5260/files#diff-1ab096eae7e5571b6410a123567aac0aR57

  3. 他们在github / API文档上说:Use a List assigned to a var instead但是我不能只替换StackList,因为.push()该类不可用。还是应该完全切换到List API?var分配列表有什么区别vallist.add(2)即使分配了,我也不能添加例如的商品val吗?

我通过Homebrew安装了Scala 2.12.2。我不确定我是否使用的是IntelliJ,因为我也需要通过IntelliJ下载它,但是无论如何它都是同一版本,因此我的设置如下所示:在此处输入图片说明


顺便说一句:在终端/ Scala REPL我得到这个输出

scala> val stack = new Stack[Int]
<console>:14: warning: class Stack in package mutable is deprecated (since 2.12.0): Stack is an inelegant and potentially poorly-performing wrapper around List. Use a List assigned to a var instead.
       val stack = new Stack[Int]
                       ^

因此,适当的弃用警告似乎在那里起作用。

阿萨夫·门德尔森

不推荐使用的消息

通常,当存在不赞成使用的功能时,您只会看到所看到的一般响应。要获取详细消息,您应该使用-deprecation进行编译。要更改此设置,请使用设置->构建,执行,部署->编译器-> scala编译器,并检查相关选项(就您而言,弃用警告,其余大部分可能是个好主意)

参考必须加前缀警告

这是完全不相关的警告。当使用可变类时,scala样式是使用可变的前缀。即使用此:

import collection.mutable    
val a = new mutable.Stack[Int]

代替

import collection.mutable.Stack    
val a = new Stack[Int]

这是因为,除非有充分的理由,否则scala中的默认思维模式通常应该是使用不可变集合。

如果这困扰您,您可以随时关闭此检查。

做什么而不是堆栈

删除堆栈的原因是它只是列表的包装。推只是添加一个新的头,而流行只是带尾。

这意味着如果您具有:

val a = new mutable.Stack
a.push(XXX)
a.pop(XXX)

您可以将其替换为:

var a = new List
a = XXX +: a
a = a.tail

请注意,通常,您可以在此处使用不可变列表。

编辑

为了确保它更易于理解,应将var a = new List中创建的List替换为实际选择的list。

标准方法是使用标准Scala创建方法,例如:

var a = List[Int]()  
var a: List[Int] = Nil 

但是如果需要更多功能,也可以根据需要选择另一个具体列表。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章