2009-09-13 42 views
13

Tôi có một hàm lồng nhau tương đối sâu trong một nhóm bảng. Có cách nào trong C/C++ để có được một "tài liệu tham khảo" để chức năng đó và đẩy rằng (và args) vào ngăn xếp khi tôi cần phải sử dụng nó?Tham chiếu đến hàm Lua trong C/C++

Trả lời

20

Đây là những gì mà reference system dành cho. Gọi hàm r = luaL_ref(L, LUA_REGISTRYINDEX) lưu trữ giá trị ở trên cùng của ngăn xếp trong sổ đăng ký và trả về một số nguyên có thể được lưu trữ ở phía C và được sử dụng để truy lục giá trị bằng lệnh gọi hàm lua_rawgeti(L, LUA_REGISTRYINDEX, r).

Xem PiL chapter, cũng như tài liệu về luaL_ref(), lua_rawgeti()luaL_unref() cho toàn bộ câu chuyện.

2

API Lua (http://www.lua.org/manual/5.1/manual.html#3) có thể được sử dụng để xác định bất kỳ thành viên nào trong bảng mà bạn muốn. Sử dụng lua_gettable() để trích xuất một thành viên bảng và đặt nó trên ngăn xếp lua, nếu thành viên cũng là một bảng chỉ cần gọi lua_gettable() một lần nữa để truy cập vào bảng này ...

(Tùy thuộc vào những gì bạn đang làm lua_rawget() có thể là một lựa chọn tốt hơn so với lua_gettable())

addtional để phản ứng lại bình luận:

được rồi đó là thú vị hơn một chút. Vâng, một bảng là một đối tượng tham chiếu (nhiều hơn hoặc ít hơn), vì vậy bạn có thể an toàn để lưu tham chiếu bảng trong cùng một nơi nào đó.

Vì API lua dường như không có cách nào để thao tác trực tiếp bảng ref, có thể bạn sẽ phải đẩy ref vào toàn cầu hoặc nếu nó không hoạt động một bảng mới với một mục nhập bảng duy nhất. Khi bạn muốn ref sau này, chỉ cần lấy nó từ toàn cầu.

ví dụ:

// Final table reference is now at top of stack, after multiple dereferences 
lua_setglobal(L, "mytableref"); 
+0

Tôi đã biết cách thực hiện điều đó :) Tôi muốn nhận hàm được tham chiếu lồng nhau sâu trong bảng để sau này tôi có thể gọi hàm mà không phải duyệt qua tất cả các bảng đó. – jameszhao00

+0

[Đã thêm vào câu trả lời] –

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