我想在collection.immutable.Stack[xml.MetaData]
中维护一堆元素属性。问题如下:
scala> import scala.xml.MetaData
import scala.xml.MetaData
scala> import scala.xml.Null
import scala.xml.Null
scala> val s = Stack[MetaData]()
s: scala.collection.immutable.Stack[scala.xml.MetaData] = Stack()
scala> s push Null
res1: scala.collection.immutable.Stack[scala.xml.MetaData] = Stack()
scala> s.pop
java.util.NoSuchElementException: pop of empty stack
at scala.collection.immutable.Stack.pop(Stack.scala:113)
... 33 elided
堆栈是空的!我想这是因为MetaData
实际上是一个迭代器,而Null
代表一个空的迭代器。
我希望能够像我推动的那样弹出多次,但我不能因为我每次MetaData
Null
都没有推动任何事情。建议的解决方法是什么?我可以用Option
包裹它,但那只会很奇怪,因为它总是Some
。
答案 0 :(得分:2)
实际上这不是关于xml.MetaData或类似的东西。
问题是您正在使用不可变数据结构但尝试更改其内容。不可变堆栈的推送不会改变当前堆栈,它只会返回一个新值推送的堆栈。你应该使用scala.collection.mutable.Stack
来做出可变的事情。以下作品:
import scala.collection.mutable.Stack
val s = Stack[MetaData]()
s push Null
s.pop
以下输出:
res9: scala.xml.MetaData =