2017-01-01 2 views
0

У меня есть следующий фрагмент кода в Скале, который не работает:Доступ к списку списков внутри а, для

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 
    } 
} 
+1

Можете ли вы опубликовать [MCVE] вашей проблемы? –

+1

Возможно, потому что 'List' является неизменным, и вы не можете« обновить »его на месте. Используйте 'mutable.ListBuffer' или что-то в этом роде. –

ответ

1

Списки неизменны. Попробуйте вместо этого:

val tacTable = p.classes.map { _.methods.map { _ => 
    new TACList() 
} 
1

, так как я не могу комментировать на начальном посте Sidenote здесь:

в Скале для понимания, вы можете использовать несколько генераторов в один для. так вложенность, что вы использовали не нужна, так как вы можете использовать это:

for (i <- 0 to l.length; j <- 0 to l.length) { 
    // your code 
} 

Кроме того, это, кажется, не применяется в вашем случае, но если вы имели плоский отображенный результат, который вы должны использовать выход из для понимания вместо мутации в теле

Смежные вопросы