2015-12-09 7 views
1

Я работаю с Lua 5.0, то, что озадачивает меня почему следующий код работает:Lua общий для цикла спецификации

for i in {first=1,second=2,third=3} do 
    print(i) 
end 

Он печатает «первый», «второй», «третий». Однако, согласно онлайн-программированию в Lua для 5.0 «Первое, что нужно сделать, - это оценить выражения после in. Эти выражения должны приводить к трем значениям, сохраненным функцией for: iterator, инвариантным состоянием и начальное значение для управляющей переменной. "

В этом случае выражение после in является просто таблицей. Он не будет оценивать (функция, состояние, начальное значение), и любой последующий вызов будет вызовом самой таблицы. Но приведенный выше пример работает, почему?

+3

Lua 5.0 все еще ?? – lhf

ответ

0

В Lua 5.2 (стандарт) этот код выдает ошибку

Runtime Error: 
tst.lua:1: attempt to call a table value 

Так что я не знаю, что вы делаете, но в любом случае, что вы делаете это неправильно .

+0

Как уже говорилось, я использую Lua 5.0, здесь выход: > для г в первом {= 1, второй = 2} делать печать (я) конец первый второй > – user3015347

1

Вышеупомянутый для цикла справедливо для версии 4.0, см http://www.lua.org/manual/4.0/manual.html#4.4

А для заявления как

for index, value in exp do block end 

эквивалентен коду:

do 
    local _t = exp 
    local index, value = next(t, nil) 
    while index do 
     block 
     index, value = next(t, index) 
    end 
    end 

Как показано, «exp» после «in» может быть таблицей. Это сильно отличается от синтаксиса в версии 5.0 и далее. Однако мой эксперимент показывает, что 5.0 по-прежнему относится к этому старому стилю. Это объясняет, что я видел.

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