Scala 如何解决重新分配到val错误?
我正在编写一个解析器,试图计算一个包含float和RDD的表达式的结果,我有override+-/*并且它工作得很好。在一个部分中,我得到了著名的错误“重新分配到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
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()