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
.
我知道它通常与 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
.