Lua中的“in”关键字有什么作用?

时间:2015-02-04 02:47:01

标签: loops for-loop lua

我知道它通常与 for i,v in pairs() do 循环(或ipairs,甚至next)相结合,但究竟是什么in?< / p>

为了澄清,我知道如何使用它,我只是不知道它背后的逻辑,它是如何工作的/它返回的是什么?

2 个答案:

答案 0 :(得分:9)

Lua的in不是函数或变量。它是流控制语法的一部分。您无法替换它,您无法复制它,您甚至无法引用它。它更像是括号:一个句法结构,它对程序的解析方式有意义,但不能在程序中引用。

它没有&#34;返回&#34;任何东西。它没有&#34;逻辑。&#34;它更像是占位符或标点符号。

答案 1 :(得分:7)

它没有做任何事情。这是语法。它不是一个功能。它不是一个操作码。它不是一种语言功能。它纯粹是语法上的。

请参阅lparser.c中的forlist功能:

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