【问题标题】:Can't figure the statement logic in Lua (ESP8266 sample)无法计算 Lua 中的语句逻辑(ESP8266 示例)
【发布时间】:2015-05-01 07:15:32
【问题描述】:

我在 GitHub 页面上遇到的 NodeMCU 切换 LED 的程序之一是:

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

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

谁能帮我弄清楚下面sn-p中以下语句的含义:

本地_,_,方法,路径,var...........

据我了解,我们声明了 2 个匿名变量,然后是称为方法、路径和 vars 的附加变量,并通过对请求对象执行字符串搜索操作来设置 vars 的值。

但是由于我们没有使用匿名变量和方法,它们将是 nil,因此 path 也将评估为 nil,因为方法是 nil。所以我删除了匿名变量、方法和路径变量并上传了代码。当我尝试浏览 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:调用 Lua API 时出现不受保护的错误(init.lua:27:尝试连接全局“_off”(一个 nil 值))

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

【问题讨论】:

    标签: lua esp8266


    【解决方案1】:

    _ 不是匿名变量;它是一个常规变量,但有一个约定是使用 _ 来指示您在代码中忽略的变量。

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

    片段首先检查 URL 是否为method URL?parameters 形式并获取方法、URL 和参数。第二个检查是method URL(因为它不会被第一个模式匹配匹配)。

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

    【讨论】:

    • 由于我的默认 url 格式(在测试代码中)是 192.168.1.2/?pin=OFF 或 192.168.1.2/?pin=ON 的形式,我相信方法和路径变量不会习惯。所以我将它们从代码中删除并上传到 ESP。当我尝试访问该页面时,它不起作用,我无法打开或关闭 PIN。那么是否需要方法和路径变量(即使我没有评估它们)?
    • 您更新了模式吗?如果您不打算捕获它们,则需要删除第一组和第二组周围的括号:local _, _, vars = string.find(request, "[A-Z]+ .+?(.+) HTTP")
    • 感谢保罗。我现在按原样使用代码,但您的解释确实帮助我理解了这种模式。
    • 好。如果它对您的问题有所帮助,您可能希望接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多