我正在编写一个解析器,试图计算包含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虽然我知道它似乎不正确,但这是我脑海中唯一想要测试但它没有用的东西。 它来自哪里?
答案 0 :(得分:2)
在这段代码中:
case nums ~ op => {
if (nums=="/path1/test3D.xml")
nums=sv.getInlineArrayRDD()
nums
无法重新分配,因为它来自模式匹配(请参阅case
行)。最后一行(nums = ...
)尝试在nums
时无法分配。