2013-08-26 31 views
8

Tôi thực sự không hiểu chính xác về chồng.API Lua C: sự khác nhau giữa lua_gettop() và -1 là gì?

lua_gettop() 

Trả về chỉ mục của phần tử trên cùng trong ngăn xếp. Bởi vì chỉ số bắt đầu từ 1, kết quả này bằng với số lượng phần tử trong ngăn xếp (và vì vậy 0 có nghĩa là ngăn xếp trống).

vậy sự khác biệt giữa nó và -1 là gì?

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

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

'lua_gettop()' là một hàm, trong khi '-1' là một số nguyên theo nghĩa đen. –

+5

Bạn có nghĩ tôi ngốc không? – deepspace

+5

Không, tôi không biết. Tuy nhiên, câu hỏi của bạn không phù hợp với Stack Overflow. –

Trả lời

13

Bạn có thể tưởng tượng ngăn xếp đang phát triển từ dưới cùng, với phần tử dưới cùng (tức là lần đầu tiên được đẩy) có chỉ mục 1, sau đó bạn đẩy phần tử khác (chỉ mục 2), sau đó thêm phần tử khác (chỉ mục 3), v.v. Vì vậy, bạn có tình trạng này:

+-----------------------+ 
| 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) 
+-----------------------+ 

bạn cũng có thể nói rằng "chỉ số bình thường" (một trong những chỉ mục từ dưới lên) là chỉ số tuyệt đối của nguyên tố này (tương tự như của một mảng trong C, bên cạnh bắt đầu từ 1). Thay vào đó, chỉ mục phủ định là "tương đối" ở đầu ngăn xếp. lua_gettop cung cấp cho bạn chỉ số tuyệt đối của đầu ngăn xếp (luôn có chỉ số tương đối -1).

Tại sao có hai cách lập chỉ mục ngăn xếp, sau đó? Bởi vì đôi khi nó rất hữu ích để truy cập vào các phần tử giống như một mảng (sử dụng một chỉ mục tuyệt đối) và đôi khi bạn chỉ cần truy cập vào các phần tử được đẩy cuối cùng (để lập chỉ mục từ trên cùng).

BTW, tôi thường hình dung ngăn xếp Lua đảo ngược: bắt đầu từ phía trên và phát triển xuống dưới (tức là ngăn xếp nằm ở cuối bản trình bày tinh thần của tôi). Tôi thấy mô hình tinh thần này hữu ích hơn vì tôi giải thích chỉ mục -1 là "bước trở lại mã (trở lên, do đó) cho đến khi bạn tìm thấy lần đẩy đầu tiên". Trong thời trang này, chỉ số -2 sẽ là "bước trở lại mã cho đến khi bạn tìm thấy lần đẩy thứ hai", v.v. Tất cả điều này giúp tôi nhanh chóng xác định nơi tôi đã đẩy nội dung gì.

Tuy nhiên, để tránh nhầm lẫn, ở đây tôi đã sử dụng một biểu diễn cổ điển hơn, nơi đầu ngăn xếp được vẽ thực sự ở trên cùng!

+0

Thật tuyệt vời! Câu trả lời hay. – deepspace

2

Không có sự khác biệt nếu bạn sử dụng ngay lập tức làm chỉ mục như vậy. Nhưng bạn có thể làm những việc khác với nó, như lưu trữ chỉ mục và sử dụng nó sau này, khi nó có thể không còn là chỉ mục cuối cùng nữa.

4

Từ PIL (http://www.lua.org/pil/24.2.3.html)

Chú ý rằng một chỉ số tiêu cực -x tương đương với chỉ số tích cực gettop - x + 1.

Do đó

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

hiện giống với

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

Không khi 'lua_gettop' trả về 0. – lhf

0

Như bạn đã nêu, lua_gettop trả về chỉ mục của phần tử trên cùng trên ngăn xếp. Nếu ngăn xếp trống thì không có phần tử nào trên chỉ mục -1. Vì vậy, hàm lua_gettop cung cấp cho bạn một ranh giới cho chỉ mục mà bạn có thể sử dụng.

Các vấn đề liên quan