作者:mobiledu2502936307 | 来源:互联网 | 2023-02-04 14:09
我设置了一个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
但我仍然有这些问题:
我得到一个分为两个区域的弹出窗口.这是否意味着有两个警告,每个警告有两行.什么是真实的信息?对于第二个区域,我看到Reference必须加前缀并且正在构建中.
为什么我没有看到正确的弃用警告,就像它在这里添加:https://github.com/scala/scala/pull/5260/files#diff-1ab096eae7e5571b6410a123567aac0aR57
在GitHub/API文档他们SAI:Use a List assigned to a var instead
但我不能只替换Stack
用List
,因为.push()
不适用于该类.或者我应该完全切换到List API?使用var
或分配列表有什么区别val
?list.add(2)
即使分配了项目,我也无法添加项目val
吗?
我通过Homebrew安装了Scala 2.12.2.我不确定我是IntelliJ它是否使用自己的版本,因为我需要通过IntelliJ下载它,但无论如何它是相同的版本,所以我的设置看起来像这样:
BTW:在终端/ Scala REPL中我得到了这个输出
scala> val stack = new Stack[Int]
: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]
^
所以适当的弃用警告似乎在那里工作.
1> Assaf Mendel..:
不推荐的消息
通常,当有不推荐使用的函数时,您只能看到您看到的一般响应.要获取详细消息,您应该使用-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应该替换为实际的list列表.
标准方法是使用标准的scala创建方法,例如:
var a = List[Int]()
var a: List[Int] = Nil
但如果需要更多功能,也可以根据需要选择其他具体列表.