2015-02-04 2 views
2

Я знаю, что это обычно сочетается с петлей (или ipairs, или даже next), но что такое in?Что делает ключевое слово «in» в Lua?

Просто, чтобы уточнить, я знаю, как его использовать, я просто не знаю логики, как это работает/что он возвращает?

+1

Синтаксис. http://www.lua.org/manual/5.1/manual.html#8 –

+0

@Etan Извините, возможно, я не объяснил правильно. Я понимаю, как его использовать, я хочу знать, как это работает. – warspyking

+0

Это не «работает». Он ничего не делает. Это синтаксис. –

ответ

8

Lua's in не является функцией или переменной. Это часть синтаксиса для управления потоком. Вы не можете его заменить, вы не можете его скопировать, вы даже не можете ссылаться на него. Это скорее похоже на круглые скобки: синтаксическая конструкция, которая имеет смысл для того, как анализируется программа, но которая не может быть упомянута внутри программы.

Это ничего не возвращает. У него нет «логики». Это больше похоже на местозаполнитель или пунктуацию.

+1

Спасибо. Я могу принять через 4 мин. – warspyking

+1

следует также упомянуть, что то же самое верно для 'do-end' – hjpotter92

7

Это не делает ничего. Это синтаксис. Это не функция. Это не код операции. Это не язык. Это чисто синтаксический.

Смотрите функцию forlist в lparser.c:

static void forlist (LexState *ls, TString *indexname) { 
    /* forlist -> NAME {,NAME} IN explist1 forbody */ 
    FuncState *fs = ls->fs; 
    expdesc e; 
    int nvars = 0; 
    int line; 
    int base = fs->freereg; 
    /* create control variables */ 
    new_localvarliteral(ls, "(for generator)", nvars++); 
    new_localvarliteral(ls, "(for state)", nvars++); 
    new_localvarliteral(ls, "(for control)", nvars++); 
    /* create declared variables */ 
    new_localvar(ls, indexname, nvars++); 
    while (testnext(ls, ',')) 
    new_localvar(ls, str_checkname(ls), nvars++); 
    checknext(ls, TK_IN); 
    line = ls->linenumber; 
    adjust_assign(ls, 3, explist1(ls, &e), &e); 
    luaK_checkstack(fs, 3); /* extra space to call generator */ 
    forbody(ls, base, line, nvars - 3, 0); 
} 

Создание управляющих переменных. Обработать локальные переменные в списке запятой. Убедитесь, что следующий токен TK_IN, который соответствует luaX_tokens.