正如标题所说,我正在尝试将一些命令存储在我正在编写的程序中(代码生成器),只是为了在稍后阶段解释它们。
这主要是因为某些命令需要来自其他人的信息,而且我认为不会对命令发送者强制执行非常严格的命令会更好(尽管这种选择也有使其变得更难的缺点)决定命令是否为vadid)。
问题是一个非常简单的问题:在Scala中,除了Buffer之外,我无法想到任何其他集合来表示此命令队列。在我的情况下不需要并发,并且使用一次更新一个元素的不可变集合感觉很愚蠢。
另一方面,我希望尽可能地减少程序中的可变性 - 这是一个可以合理完成的地方吗?或者我的直觉是正确的,缓冲区是我自然适合的情况..
这是一个草图,说明如果使用不可变集合,这个商店会是什么样子。 (终止命令会说我们已经完成了给定符号的更新,然后可以通过将其唯一的BuildCommand与零个或多个UpdateCommands一起解释来构造)
trait Outcome
sealed trait Command {
def symId : String
}
sealed trait ChangeCommand extends Command
sealed trait BuildCommand extends Command
sealed trait UpdateCommand extends Command
final case class TerminationCommand(symId: String) extends Command
var comQueue = immutable.Seq[ChangeCommand]()
private def translate(sId : String) : Outcome = {
val forSymb = comQueue filter {_.symId}
//...
}
def interpret(c : Command) = c match {
case cc : ChangeCommand =>
comQueue = comQueue + cc
None
case TerminationCommand(s) =>
Some(translate(s))
}
答案 0 :(得分:0)
如果你只追加操作然后顺序访问它们,我想不出比不可变列表更合适。只需使用Seq()
即可。