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

What does the "in" keyword in Lua do?

我知道它通常与 for i,v in pairs() do 循环(或 ipairs,甚至 next)结合使用,但 in?

澄清一下,我知道如何使用它,只是不知道它背后的逻辑,它是怎么做到的work/what return?

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

它没有 "return" 任何东西。它没有 "logic." 它更像是一个占位符,或者标点符号。

它什么也没做。它是语法。这不是一个功能。它不是操作码。它不是语言功能。它纯粹是语法。

参见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 which maps to luaX_tokens.