unofficial Lua FAQ có mục nhập về hộp cát ở Lua. Tôi đoán là bạn có thể chuyển đổi logic đó đủ dễ dàng tới mã C/C++ của bạn.
Xem thêm LuaFiveTo on the lua-users wiki.
Correction
Đó là thực sự không phải là tầm thường như nó có vẻ. Nhưng cuối cùng là điểm đơn giản: tải đoạn của bạn, đẩy bảng _ENV, sử dụng lua_setupvalue(L,-2,1)
. Điều quan trọng là bảng nên ở trên cùng của ngăn xếp.
Như một ví dụ nhỏ, sử dụng 2 môi trường mặc định cho _G để đọc những thứ qua metatables:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main(void){
lua_State *L = luaL_newstate();
char *file1 = "file1.lua";
char *file2 = "file2.lua";
luaL_openlibs(L);
luaL_loadfile(L,file2); // S: 1
luaL_loadfile(L,file1); // S: 2
lua_newtable(L); // ENV for file 1: S: 321
lua_newtable(L); // ENV for file 2: S: 4321
//lets have each function have its metatable, where missed lookups are
//instead looked up in the global table _G
lua_newtable(L); // metatable S: 54321
lua_getglobal(L,"_G"); // pushes _G, which will be the __index metatable entry S: 654321
lua_setfield(L,-2,"__index"); // metatable on top S: 54321
lua_pushvalue(L,-1); // copy the metatable S: 554321
lua_setmetatable(L,-3); // set the last copy for env2 S: 54321
lua_setmetatable(L,-3); // set the original for env1 S: 4321
// here we end up having 2 tables on the stack for 2 environments
lua_setupvalue(L,1,1); // first upvalue == _ENV so set it. S: 321
lua_setupvalue(L,2,1); // set _ENV for file S: 21
// Remaining on the stack: 2 chunks with env set.
lua_pcall(L,0,LUA_MULTRET,0);
lua_pcall(L,0,LUA_MULTRET,0);
lua_close(L);
return 0;
}
Và đối với các tập tin 2 Lua:
-- file1.lua
function init()
A="foo"
print("Hello from file1")
print(A)
end
init()
-- file2.lua
-- this shows that stuff defined in file1 will not polute the environment for file2
print("init function is",tostring(init))
function init()
A="bar"
print("Hello from file2")
print(A)
end
init()
Đây là một trong những lý do tại sao tôi đã bị mắc kẹt với lua 5.1 trong các dự án riêng của tôi bây giờ. Tôi tin rằng các hàm v5.2 'load' và' loadfile' cho phép bạn chỉ định một môi trường; họ có lẽ là nơi tốt nhất để bắt đầu tìm kiếm giải pháp. – Rook
cảm ơn nhưng tôi đọc về tải và loadfile tuy nhiên tôi không thể tìm thấy một giải pháp – Steve
'setuservalue' chắc chắn không phải là chức năng chính xác để sử dụng khi cố gắng thao tác với môi trường. Các tài liệu lua dường như không rõ ràng về những gì bạn nên làm, tuy nhiên. 'lua_load' nói rằng một upvalue duy nhất liên kết với một đoạn nạp được thiết lập như môi trường của nó, nhưng không đề cập đến cách bạn đi về liên kết một upvalue với đoạn từ C. Nếu bạn đang tải đoạn từ bên trong lua, phiên bản lua của Hàm 'load' trông giống như nó nên thiết lập môi trường một cách chính xác. – Rook