我完全不瞭解堆棧。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)) {
我完全不瞭解堆棧。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)) {
您可以想象堆棧從底部增長,底部(即第一個被推入的)元素具有索引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將是「後退代碼,直到你找到第二個推」等等。所有這些都可以幫助我快速識別我推送的內容。
但是,爲了避免混淆,在這裏我使用了一個更經典的表示法,其中棧頂真正位於頂部!
太棒了!很好的答案。 – deepspace
如果您立即使用它作爲索引,就沒有區別。但是你可以用它做其他事情,比如存儲索引並在以後使用它,當它可能不再是最後一個索引時。
從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)) {
當'lua_gettop'返回0時不行。 – lhf
正如您已經指出的那樣,lua_gettop返回堆棧頂部元素的索引。如果堆棧爲空,那麼在索引-1上沒有元素。所以函數lua_gettop給你一個你可以使用的索引的邊界。
'lua_gettop()'是一個函數,而'-1'是一個整數文字。 – 2013-08-26 13:15:01
你以爲我是白癡嗎? – deepspace
不,我不知道。不過,你的問題並不適合Stack Overflow。 – 2013-08-26 13:17:46