gpt4 book ai didi

Scala 2.12 告诉我 Stack 已被弃用,如何准确替换它(以及为什么我在 IntelliJ 中看不到正确的警告)

转载 作者:行者123 更新时间:2023-12-01 07:29:36 25 4
gpt4 key购买 nike

我设置了一个 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] 的警告:

enter image description here

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

但我仍然有这些问题:

  1. 我得到一个弹出窗口,它分为两个区域。这是否意味着有两个警告,每个警告有 2 行。什么是真实信息?对于第二个区域,我看到 必须添加前缀正在 build 中

  2. 为什么我没有看到正确的弃用警告,就像在此处添加的一样:https://github.com/scala/scala/pull/5260/files#diff-1ab096eae7e5571b6410a123567aac0aR57

  3. 在 github/API 文档上他们说:Use a List assigned to a var instead但我不能只替换StackList , 因为 .push()不适用于该类(class)。还是应该完全切换到 List API?使用 var 分配列表有什么区别?或 val ?我不能通过 list.add(2) 添加项目吗?即使它被分配了 val ?

我通过 Homebrew 安装了 Scala 2.12.2。我不确定我是否是 IntelliJ,它使用的是自己的版本,因为我也需要通过 IntelliJ 下载它,但无论如何它是相同的版本,所以我的设置如下所示: enter image description here


顺便说一句:在终端/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 样式是使用 mutable 作为前缀。即使用这个:

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

而不是

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

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

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

用什么来代替堆栈

堆栈被删除的原因是它只是一个列表的包装器。 Push 只是添加一个新的头部,而 pop 只是获取尾部。

这意味着如果你有:

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 应替换为实际选择的列表。

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

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

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

关于Scala 2.12 告诉我 Stack 已被弃用,如何准确替换它(以及为什么我在 IntelliJ 中看不到正确的警告),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43866787/

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