2015-04-21 3 views
4

Может ли кто-нибудь объяснить мне это?Lua for loop уменьшить i? Странное поведение

for i = 1, 5 do 
    print(i) 
    i = i - 1 
    print(i) 
end 

Выход:

1 
0 
2 
1 
3 
2 
and so forth 

Я exspected я изменить между 1 и 0. Но, очевидно, она продолжает расти, как если бы я не изменил его вообще. Что происходит?

Мне нужно время от времени удалять элемент i-го стола. Таким образом, следующий элемент для обработки будет я снова. В C я бы просто написал -i в конце моего содержимого цикла. Любой официальный способ в lua? :)

+1

Не используйте для этого переменную управления контуром. Используйте другое условие (даже то, что всегда верно с условием ручного разрыва). –

+0

Вы также можете отслеживать разницу: 'local d = 0; для/do i = i-d; если /, то d = d + 1 конец ... конец'. – user3125367

ответ

6

Индекс цикла (i в вашем случае) является локальной переменной в теле цикла, поэтому любые модификации вы делаете на него не оказывают влияния на условия цикла или следующего элемента, обрабатываемого (для for петля).

Если вам нужно лучше контролировать индекс для удаления элементов и продолжать обработку, вы должны использовать форму цикла while. Подробнее см. В разделе For Statement.

2

Как насчет использования петли while(true)? Тогда вам придется рубить вручную, но это может сработать.

local i = 5 
while(true) do 
    print(i) 
    i = i - 1 
    if (i == 0) then break; end 
end 
1

Попытка установить переменную управления циклом приводит к отказоустойчивому поведению.

Я не могу найти его в разделе «Несовместимость языков» последних версий руководства, но я помню, что он был указан где-то в качестве изменения. Это скорее формализация предыдущего неопределенного поведения.

Если вам действительно интересно, см. Список вашей программы от luac. Контрольной переменной цикла присваивается внутреннее имя, поэтому его нельзя изменить. Если в назначении используется одно и то же имя, локальная переменная синтезируется как резервная. Это предотвращает непреднамеренное превращение for в бесконечность.

Вам нужен еще один вид петли.

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