如何解决重新分配到val错误?

时间:2015-07-09 17:03:39

标签: scala parsing

我正在编写一个解析器,试图计算包含float和RDD的表达式的结果,我有覆盖+ - / *并且它工作正常。在一个部分我得到了一个着名的错误"重新分配到val"但无法弄清楚如何解决它。 部分代码如下:

 def calc: Parser[Any]=rep(term2 ~ operator) ^^ {
  //match a list of term~operator
  case termss =>
    var stack =List[Either[RDD[(Int,Array[Float])], Float]]()
    var lastop:(Either[RDD[(Int,Array[Float])], Float], Either[RDD[(Int,Array[Float])], Float]) => RDD[(Int,Array[Float])] = add
    termss.foreach(t =>
    t match { case nums ~ op => {
                            if (nums=="/path1/test3D.xml")
                                    nums=sv.getInlineArrayRDD()
                            lastop = op; stack = reduce(stack ++ nums, op)}}
    )

   stack.reduceRight((x, y) => lastop(y, x))
}
def term2: Parser[List[Any]] = rep(factor2)
def factor2: Parser[Any] = pathIdent | num | "(" ~> calc <~ ")"
def num: Parser[Float] = floatingPointNumber ^^ (_.toFloat)

我定义了pathIdent来解析路径。 这是错误:

    [error]  reassignment to val:
    [error]                                         nums=sv.getInlineArrayRDD()
    [error]                                             ^

我已经将term2,factor2和num中的def更改为var虽然我知道它似乎不正确,但这是我脑海中唯一想要测试但它没有用的东西。 它来自哪里?

1 个答案:

答案 0 :(得分:2)

在这段代码中:

case nums ~ op => {
  if (nums=="/path1/test3D.xml")
    nums=sv.getInlineArrayRDD()

nums无法重新分配,因为它来自模式匹配(请参阅case行)。最后一行(nums = ...)尝试在nums时无法分配。