[英]Lua C API: what's the difference between lua_gettop() and -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將“ 退回到代碼中,直到找到第二次推送 ”等等。所有這些都有助於我快速確定我推送的內容。
但是,為了避免混淆,我在這里使用了更經典的表示法,其中堆棧頂部真的在頂部繪制!
來自PIL( http://www.lua.org/pil/24.2.3.html )
請注意,負索引-x等於正索引gettop - x + 1。
因此
if( lua_isfunction(L,lua_gettop(L)) ) {
做同樣的事
if( lua_isfunction(L,-1) ) {
如果您立即將其用作此類索引,則沒有區別。 但是你可以用它來做其他事情,比如存儲索引並在以后使用它時,它可能不再是最后一個索引。
正如您已經說過的那樣,lua_gettop返回堆棧頂部元素的索引。 如果堆棧為空,則索引-1上沒有元素。 因此,函數lua_gettop為您提供了可以使用的索引的邊界。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.