Ошибка при самостоятельном запуске анонимных функций в Lua - PullRequest
3 голосов
/ 26 мая 2020

Я пытаюсь использовать самозапускающиеся анонимные функции в Lua и наблюдаю какое-то странное поведение.

Это:

(function ()
  print("self-invoking approach")
end)()

print("standard approach")

работает нормально и выводит следующий результат:

self-invoking approach
standard approach

, но поменять местами два:

print("standard approach")

(function ()
  print("self-invoking approach")
end)()

приводит к этой ошибке:

➜  hammerspoon   lua temp.lua
standard approach
lua: temp.lua:1: attempt to call a nil value
stack traceback:
    temp.lua:1: in main chunk
    [C]: in ?

Как ни странно, когда код выполняется в Lua REPL, сбой происходит только тогда, когда форма функции является второй, и оба вызова заключены во внешнюю функцию, которая вызывается:

function foo()
    print("standard approach")

    (function ()
      print("self-invoking approach")
    end)()
end

foo()

Что здесь происходит?

1 Ответ

4 голосов
/ 27 мая 2020

Это двусмысленность парсинга. Нерабочий случай анализируется как:

print("standard approach")(function ()
  print("self-invoking approach")
end)()

Другими словами, он печатает standard approach, затем принимает возвращаемое значение этого print (что составляет nil) и пытается вызовите это с помощью своей самозапускающейся функции в качестве аргумента (после чего он также попытался бы вызвать результат этого, если бы он еще не разбился). Чтобы исправить это, добавьте точку с запятой в конце первого вызова функции print.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...