2013-08-26 108 views
8

我完全不瞭解堆棧。Lua C API:lua_gettop()和-1有什麼區別?

lua_gettop() 

返回堆棧頂部元件的索引。由於索引 從1開始,因此此結果等於 堆棧中的元素數(因此0表示空堆棧)。

那麼它和-1有什麼區別?

lua_getglobal(L,"Foo"); 
if(lua_isfunction(L,lua_gettop(L))) { 

lua_getglobal(L,"Foo"); 
if(lua_isfunction(L,-1)) { 
+5

'lua_gettop()'是一個函數,而'-1'是一個整數文字。 – 2013-08-26 13:15:01

+5

你以爲我是白癡嗎? – deepspace

+5

不,我不知道。不過,你的問題並不適合Stack Overflow。 – 2013-08-26 13:17:46

回答

13

您可以想象堆棧從底部增長,底部(即第一個被推入的)元素具有索引1,然後再推入另一個元素(索引2),然後是另一個元素(索引3)等。所以,你有這樣的情況:

+-----------------------+ 
| element with index 6 | <-- top ("relative" index -1) 
+-----------------------+ 
| element with index 5 | <-- -2 
+-----------------------+ 
| element with index 4 | <-- -3 
+-----------------------+ 
| element with index 3 | <-- -4 
+-----------------------+ 
| element with index 2 | <-- -5 
+-----------------------+ 
| element with index 1 | <-- bottom ("relative" index -6) 
+-----------------------+ 

你也可以說,「普通索引」(從底部的一個索引)是元素的絕對指標(如,在C數組的,除了從開始1)。相反,負指數與堆棧頂部「相對」。 lua_gettop爲您提供了堆棧頂端的絕對索引(始終相對索引爲-1)。

爲什麼有兩種索引堆棧的方法呢?因爲有時候訪問像數組這樣的元素是很有用的(使用絕對索引),有時你只需要訪問最後一個被推入的元素(所以從頂部開始索引)。

順便說一句,我通常可視化Lua棧反轉:從上面開始並向下增長(即堆棧頂部是在我的心理表徵的底部)。我發現這個心智模型更有用,因爲我將索引-1解釋爲「後退代碼(因此,直到你找到第一個推動」)。以這種方式,索引-2將是「後退代碼,直到你找到第二個推」等等。所有這些都可以幫助我快速識別我推送的內容。

但是,爲了避免混淆,在這裏我使用了一個更經典的表示法,其中棧頂真正位於頂部!

+0

太棒了!很好的答案。 – deepspace

2

如果您立即使用它作爲索引,就沒有區別。但是你可以用它做其他事情,比如存儲索引並在以後使用它,當它可能不再是最後一個索引時。

4

從PIL(http://www.lua.org/pil/24.2.3.html

注意,負指數-x相當於正折射率共達 - X + 1

因此

if(lua_isfunction(L,lua_gettop(L))) { 

確實的與

if(lua_isfunction(L,-1)) { 
+2

當'lua_gettop'返回0時不行。 – lhf

0

正如您已經指出的那樣,lua_gettop返回堆棧頂部元素的索引。如果堆棧爲空,那麼在索引-1上沒有元素。所以函數lua_gettop給你一個你可以使用的索引的邊界。