簡體   English   中英

Lua C API:lua_gettop()和-1之間有什么區別?

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

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