[英]attempt to compare nil with number stack traceback?
I'm playing with Lua following this link: https://www.lua.org/pil/4.2.html and get confused about a point.
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
有問題。 任何意見都非常感謝。 編輯:我只是意識到這可能是因為它在終端中不起作用。
它在交互式終端中不起作用。 因為一旦你按下回車, local i=1
就會被終端理解為一個塊。 這就是“嘗試將 nil 與數字進行比較”錯誤的原因; 因為 i 沒有定義,即在這種情況下為零。 要更正它,請將前兩行和 while 循環放在 do chuck 中,如下所示。
> 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
>
實際上問題出在local i=1
嘗試
> local i = 1
> print(i)
問題是,在運行控制台時,該行似乎是一個塊,而變量是該塊內的本地變量。 你可以通過使用全局變量來解決這個問題,或者你可以這樣做
> local i = 1 do
>> print(i)
>> end
這導致像這樣的塊結構[local i [print(i)]]
因此可以訪問 i。 另請注意, local x = i*2
是有效的,因為它在while - do
塊內。
如果它位於 Lua 文件中,您的代碼也可以正常工作。
我也可以在 Lua 5.3.4 中重現該問題。
如果您繼續閱讀Lua 文檔,第 4.2 章 – 局部變量和塊,您將看到這句話
請注意,如果您在交互模式下輸入此示例,它將無法按預期工作。 第二行,local i = 1,本身就是一個完整的塊。
這正好解決了所討論的問題。 因此,Lua 解釋器似乎對最外層塊的支持有限(顯然存在於 Lua 文件中)。 但鑒於語言和解釋器的緊湊性,這種行為在我看來是可以接受和可以理解的。
所以,在交互模式下,
要么在變量i
之前省略local
變量以使其工作:
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
這兩個選項都將產生常規(和預期)output:
2
4
6
8
10
12
14
16
18
20
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.