【问题标题】:What does the "in" keyword in Lua do?Lua 中的“in”关键字有什么作用?
【发布时间】:2015-02-04 02:47:00
【问题描述】:

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

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

【问题讨论】:

  • @Etan 对不起,也许我没有正确解释。我知道如何使用它,但我想知道它是如何工作的。
  • 它“不起作用”。它什么也没做。这是语法。
  • 什么意思?如果它什么也没做,为什么不只是 for i,v pairs(tab) do
  • 有可能。只是不是。用“in”读起来更好。

标签: loops for-loop lua


【解决方案1】:

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

它不会“返回”任何东西。它没有“逻辑”。它更像是一个占位符或标点符号。

【讨论】:

  • 还应该提到do-end也是如此
【解决方案2】:

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

参见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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多