2015-02-28 6 views
1

Одна из программы я наткнулся на GitHub страницу для NodeMCU чтобы тумблер СИД был:не могу понять логику заявление в Lua (ESP8266 образца)

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

Чтобы упростить код я понял, что некоторые переменные не используются, и я мог просто удалить эти строки. Но, к моему большому удивлению, мой код переставал работать, когда я удалял эти строки из кода, который я загрузил на свой ESP8266.

Может кто-то пожалуйста, помогите мне выяснить смысл следующего высказывания в приведенном ниже фрагменте кода:

местные _, _, метод, путь, вар ...........

Как я понимаю, мы объявляем 2 анонимные переменные, а затем дополнительную переменную, называемую методом, path и vars, и устанавливаем значение vars, выполняя операцию поиска строк по объекту запроса.

Но поскольку мы не используем анонимные переменные и метод, который будет равен нулю, и, следовательно, путь будет также оцениваться как 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' (нилъ значение))

Помогите мне понять, полный смысл программы.

ответ

1

_ не является анонимной переменной; это регулярная переменная, но есть соглашение использовать _, чтобы указать переменные, которые вы игнорируете в своем коде.

В этом случае string.find возвращает начальное и конечное положение первого совпадения, а затем все захватывает (те группы, которые у вас есть в круглых скобках), поэтому автору нужны только захваченные и начальные/конечные позиции.

Фрагмент сначала проверяет, имеет ли URL-адрес форму method URL?parameters и получает метод, URL и параметры. Вторая проверка - для method URL (так как она не будет соответствовать первому совпадению шаблонов).

Если присутствует значение vars, оно анализируется на пары ключ/значение в виде строки запроса.

+0

Поскольку мой формат url по умолчанию (в тестовом коде) имеет форму 192.168.1.2/?pin=OFF или 192.168.1.2/?pin=ON, я считаю, что методы и переменные пути не будут использоваться. Поэтому я удалил их из кода и загрузил в ESP. Когда я пытаюсь получить доступ к странице, это не работает, и я не могу включить или выключить ПИН. Так нужны переменные метода и пути (даже если я их не оцениваю)? – user869375

+0

Вы обновили шаблон? Вам нужно удалить скобки вокруг первой и второй группы, если вы их не собираете: 'local _, _, vars = string.find (запрос,« [A-Z] +. +? (. +) HTTP »)'. –

+0

спасибо Пол. Я теперь использую код как есть, но ваше объяснение помогло мне понять шаблон. – user869375

 Смежные вопросы

  • Нет связанных вопросов^_^