【问题标题】:How to solve reassignment to val error?如何解决重新分配到 val 错误?
【发布时间】:2015-07-09 17:03:39
【问题描述】:

我正在编写一个解析器,试图计算包含浮点数和 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,尽管我知道这似乎不正确,但这是我想到的唯一要测试的东西,但它没有用。 它来自哪里?

【问题讨论】:

    标签: scala parsing


    【解决方案1】:

    在这段代码中:

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

    nums 不可重新分配,因为它来自模式匹配(请参阅case 行)。最后一行 (nums = ...) 尝试分配给 nums,但它不能。

    【讨论】:

    • 要解决可重新分配的问题,您可以从中创建一个新的val。例如,val newNums = if (???) ??? else ???.
    • 我这样做了: var newNums = if(nums=="...") newNums=sv.getInline() else newNumes=0 .... 它给出了以下错误:recursive variable newNums 需要类型
    • @Rubbic 那是因为你试图定义一些东西(newNums)并同时使用它。那应该是:`val newNums = if (num == "...") sv.getInline() else 0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多