Как работает автоматическое введение блока do ... end для оператора goto? - PullRequest
7 голосов
/ 21 ноября 2019

Комментарий lua doc к области действия метки:

Goto может перейти к любой видимой метке, если она не входит в область действия локальной переменной

Итак, в моем понимании, следующий код проблематичен:

-- codelist 1
goto a
local x = 42
::a::

Но он хорошо работает в lua web shell . Документ продолжает говорить:

Обратите внимание, что вы можете думать о

do
  <...>
  --::a::
  goto a  -- invalid (forward jump into scope of local definition)
  goto b  -- valid (jump out of block)
  <...>
  local x
  <...>
  ::a::
  <...>
  --goto a
  ::b::
end

как эквивалентном

do
  <...>
  --::a::
  goto a  -- invalid (jump into nested block prohibited because nested label not even visible here)
  goto b  -- valid (jump out of block)
  <...>
  do
    local x
    <...>
    ::a::
    <...>
    --goto a
  end
  ::b::
end

Почему ::a::входит в автоматически введенный блок do...end и почему не ::b::? Пожалуйста, помогите мне понять, спасибо.

Редактировать: Я также нашел этот старый пост , и, похоже, действительно было время, когда список кодов 1 был запрещен.

1 Ответ

8 голосов
/ 21 ноября 2019
goto a
local x = 42
::a::

не приведет к ошибке. С другой стороны, даже в 5.2

goto a
local x = 42
::a::
print("oh no")

не будет.

Предварительная компиляция Lua будет только жаловаться, если вы перейдете в область действия локального и что-то сделаете после метки, пока ещев рамках местного. Так что вы можете прыгнуть туда, но вы не можете сделать что-то в этой неверной ситуации.

То же самое со вторым примером. ::b:: это конец блока. Ничего не происходит в пределах x после этого, так что можно прыгнуть туда.

goto b
local x = 42
::a::
print("oh no")
::b::

будет в порядке.

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