簡體   English   中英

嘗試將 nil 與數字堆棧回溯進行比較?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM