попытаться сравнить ноль с трассировкой стека чисел? - PullRequest
3 голосов
/ 06 ноября 2019

Я играю с Луа по этой ссылке: https://www.lua.org/pil/4.2.html и запутываюсь в точке.

Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
> x=10
> local i=1
> while i<=x do
>>  local x = i*2
>>  print(x)
>>  i=i+1
>> end
stdin:1: attempt to compare nil with number
stack traceback:
    stdin:1: in main chunk
    [C]: in ?

Полагаю, это сообщение об ошибке указывает, что с выражением while i<=x что-то не так. Любые комментарии с благодарностью. РЕДАКТИРОВАТЬ: Я просто понимаю, что это, вероятно, потому что он не работает в терминале.

Ответы [ 3 ]

3 голосов
/ 06 ноября 2019

Не получилось в интерактивном терминале. Потому что local i=1 понимается терминалом как кусок как только вы нажимаете ввод. Вот почему ошибка «попытка сравнить ноль с числом»;потому что я не определен, т. е. ноль в этом случае. Чтобы исправить это, поместите первые две строки и цикл while внутри do-патрона, как показано ниже.

> do
>>  x = 10
>>  local i=1
>>  while i<=x do
>>    local x = i*2
>>    print(x)
>>    i = i+1
>>  end
>> end
2
4
6
8
10
12
14
16
18
20
> 
2 голосов
/ 06 ноября 2019

На самом деле проблема в local i=1 try

> local i = 1
> print(i)

Проблема в том, что при запуске консоли кажется, что строка является чанком, а переменная является локальной внутри этого чанка. Вы можете исправить это, используя глобальную переменную, или вы можете сделать это

> local i = 1 do
>> print(i)
>> end

, что приводит к такой структуре чанка, как эта [local i [print(i)]], поэтому ко мне можно получить доступ. Также обратите внимание, что local x = i*2 действителен, поскольку он находится внутри блока while - do.

Ваш код также будет работать правильно, если он находится внутри файла Lua.

1 голос
/ 06 ноября 2019

Я мог бы воспроизвести проблему и в Lua 5.3.4.

Если вы читаете в Документах Lua, глава 4.2 - Локальные переменные и блоки , вы получитепредложение

Помните, что этот пример не будет работать должным образом, если вы введете его в интерактивном режиме. Вторая строка, local i = 1, сама по себе является полным чанком.

Это решает именно эту проблему. Таким образом, кажется, что интерпретатор Lua имеет ограниченную поддержку внешнего фрагмента (который явно присутствует в файле Lua). Но это поведение кажется мне приемлемым и понятным ввиду компактности языка и интерпретатора.

Итак, в интерактивном режиме

либо пропустите local перед переменной i, чтобы она заработала:

Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
Lua>x=10
Lua>i=1
Lua>while i<=x do
...>local x=i*2
...>print(x)
...>i=i+1
...>end

или начало заключать все в блок:

Lua 5.3.4  Copyright (C) 1994-2017 Lua.org, PUC-Rio
Lua>do
...>local x=10
...>local i=1
...>while i<=x do
...>local x=i*2
...>print(x)
...>i=i+1
...>end
...>end

Оба варианта приведут к обычному (и ожидаемому) результату:

2
4
6
8
10
12
14
16
18
20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...