我在scala中有以下一些代码无效:
var tacTable : List[List[TACList]] = List(List())
def gen(p: Program) = {
for (i <- 0 to p.classes.length){
for (j <- 0 to p.classes(i).methods.length){
var tacInstr = new TACList()
tacTable(i)(j) = tacInstr //error: application does not take parameters
}
}
}
显然,这与我使用j访问列表并且j用于...的事实有关...我该如何解决这个问题?
为方便起见,您可以使用另一个给出相同错误的示例:
var l : List[List[Int]] = List(List(1,2),List(3,4))
for (i <- 0 to l.length) {
for (j <- 0 to l.length) {
l(i)(j) = 8
}
}
答案 0 :(得分:1)
列表是不可变的。 试试这个:
val tacTable = p.classes.map { _.methods.map { _ =>
new TACList()
}
答案 1 :(得分:1)
因为我不能在最初的帖子上评论这里的旁注:
在scala for-understanding中你可以在一个单独的for中使用多个生成器。所以你使用的嵌套是没有必要的,因为你可以使用它:
for (i <- 0 to l.length; j <- 0 to l.length) {
// your code
}
此外,这似乎不适用于您的情况,但如果您有一个平面映射结果,您应该使用for comprehension的yield而不是body中的变异