Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何解决重新分配到val错误?_Scala_Parsing - Fatal编程技术网

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

Scala 如何解决重新分配到val错误?,scala,parsing,Scala,Parsing,我正在编写一个解析器,试图计算一个包含float和RDD的表达式的结果,我有override+-/*并且它工作得很好。在一个部分中,我得到了著名的错误“重新分配到val”,但不知道如何解决它。 部分守则如下: def calc: Parser[Any]=rep(term2 ~ operator) ^^ { //match a list of term~operator case termss => var stack =List[Either[RDD[(Int,Array

我正在编写一个解析器,试图计算一个包含float和RDD的表达式的结果,我有override+-/*并且它工作得很好。在一个部分中,我得到了著名的错误“重新分配到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)
我已经将term2、factor2和num中的def改为var,虽然我知道它似乎不正确,但这是我唯一想到要测试的东西,它不起作用。 它来自哪里?

在这段代码中:

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

nums
不可重新分配,因为它来自模式匹配(请参见
案例
行)。最后一行(
nums=…
)试图分配给
nums
,但无法分配。

要解决可重新分配的问题,可以从中创建一个新的
val
。例如,
val newNums=if(??)???否则???
。我像这样做:var newNums=if(nums==“…”)newNums=sv.getInline()否则newNumes=0。。。。它给出了以下错误:递归变量newNums需要type@Rubbic这是因为您试图定义一些东西(
newNums
)并同时使用它。这应该是:`val newNums=if(num==“…”)sv.getInline()else 0
case nums ~ op => {
  if (nums=="/path1/test3D.xml")
    nums=sv.getInlineArrayRDD()