无法理解Lua中的语句逻辑(ESP8266示例)

我在 GitHub 页面上发现了一个用于 NodeMCU 的程序,用于切换 LED

https://github.com/nodemcu/nodemcu-firmware/blob/master/lua_examples/webap_toggle_pin.lua

为了简化代码以便于理解,我猜测一些变量没有被使用,所以我可以简单地删除这些行。但当我从上传到 ESP8266 的代码中删除这些行时,我的代码停止工作,让我完全惊讶。

有人可以帮助我理解下面摘录中的语句的含义吗:

local _, _, method, path, var...........

据我所知,我们声明了 2 个匿名变量,然后声明了额外的变量 method、path 和 vars,并通过对请求对象进行字符串搜索操作来设置 vars 的值。

但由于我们不使用匿名变量和 method(它们将为 nil),因此 path 也将被评估为 nil,因为 method 是 nil。因此,我删除了匿名变量、method 和 path 变量,并上传了代码。当我尝试浏览由 ESP 提供的页面时,它会抛出错误。

local buf = "";
    local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
    if(method == nil)then
        _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
    end
    local _GET = {}
    if (vars ~= nil)then
        for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
            _GET[k] = v
        end
    end

错误是

PANIC: unprotected error in call to Lua API (init.lua:27: attempt to concatenate global '_off' (a nil value))

帮助我理解程序的完整含义。

点赞
用户1442917
用户1442917

_ 并不是一个匿名变量;它是一个普通的变量,但是有一种惯例,使用 _ 表示你在代码中忽略的变量。

在这种情况下,string.find 返回第一个匹配的开始和结束位置,以及所有的捕获组(那些括号中的组),因此作者只需要捕获的位置和开始/结束位置。

该片段首先检查 URL 是否符合 method URL?parameters 格式,并获取方法、URL 和参数。第二个检查是针对 method URL 的(因为它不会被第一个模式匹配到)。

如果 vars 值存在,则将其解析为键/值对,作为查询字符串。

2015-02-28 17:41:23