2015-11-03 74 views
0

我想在collection.immutable.Stack[xml.MetaData]中维护一堆元素属性。问题如下:如何将scala.xml.Null推入堆栈[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代表一个空的迭代器。

我希望能够按照我推动的次数弹出,但是我不能,因为我不会每次都推动任何东西MetaDataNull。这是什么建议的解决方法?我可以将它包装在Option中,但那会很奇怪,因为那总是Some

回答

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 = 
+1

你是绝对正确的。实际上,我注意到了不变性,并在代码中使用了更新后的堆栈,但未在我粘贴的REPL测试中使用。此外,我的问题是,我正在解释堆栈的控制台输出,就好像顶部位于右侧(底层集合的末尾),顶部实际位于左侧(底层集合的头部)。 –