Możesz ujawnić dowolne dane Lua przez userdata
. Jeśli podasz swoje wartości danych użytkownika metatable, możesz zdefiniować zachowanie dla różnych operatorów/operacji na tych danych użytkownika. W tym przypadku chcemy odsłonić tablicę Lua i zdefiniować, co zrobić w przypadku array[index]
i array[index] = value
.
Ujawniamy tablicę Lua, tworząc bufor użytkownika o rozmiarze wystarczającym do przechowywania adresu tablicy. Definiujemy zachowanie indeksowania/przypisania, tworząc metatable metodami __index
i __newindex
.
Poniżej znajduje się pełny, działający przykład, który udostępnia statyczną tablicę Lua. Twój program prawdopodobnie będzie miał inne wezwanie do zwrócenia tablicy do Lua. Zauważ, że w ogóle nie ma żadnej kontroli; jeśli spróbujesz indeksować poza granicami tablicy, ulegniesz awarii. Aby było to bardziej niezawodne, należy zmienić dane użytkownika na strukturę, która ma wskaźnik tablicy i rozmiar tablicy, aby można było wykonywać kontrole.
#include "lauxlib.h"
// metatable method for handling "array[index]"
static int array_index (lua_State* L) {
int** parray = luaL_checkudata(L, 1, "array");
int index = luaL_checkint(L, 2);
lua_pushnumber(L, (*parray)[index-1]);
return 1;
}
// metatable method for handle "array[index] = value"
static int array_newindex (lua_State* L) {
int** parray = luaL_checkudata(L, 1, "array");
int index = luaL_checkint(L, 2);
int value = luaL_checkint(L, 3);
(*parray)[index-1] = value;
return 0;
}
// create a metatable for our array type
static void create_array_type(lua_State* L) {
static const struct luaL_reg array[] = {
{ "__index", array_index },
{ "__newindex", array_newindex },
NULL, NULL
};
luaL_newmetatable(L, "array");
luaL_openlib(L, NULL, array, 0);
}
// expose an array to lua, by storing it in a userdata with the array metatable
static int expose_array(lua_State* L, int array[]) {
int** parray = lua_newuserdata(L, sizeof(int**));
*parray = array;
luaL_getmetatable(L, "array");
lua_setmetatable(L, -2);
return 1;
}
// test data
int mydata[] = { 1, 2, 3, 4 };
// test routine which exposes our test array to Lua
static int getarray (lua_State* L) {
return expose_array(L, mydata);
}
int __declspec(dllexport) __cdecl luaopen_array (lua_State* L) {
create_array_type(L);
// make our test routine available to Lua
lua_register(L, "array", getarray);
return 0;
}
Zastosowanie:
require 'array'
foo = array()
print(foo) -- userdata
-- initial values set in C
print(foo[1])
print(foo[2])
print(foo[3])
print(foo[4])
-- change some values
foo[1] = 2112
foo[2] = 5150
foo[4] = 777
-- see changes
print(foo[1])
print(foo[2])
print(foo[3])
print(foo[4])
Ponieważ Lua jest pomyślana jako języka do osadzenia na interfejs ładnie z C, spodziewałbym dokumentacja lua dostarczyć wiele przykładów. Czy przeglądałeś już te informacje? – Jens
Dzięki za szybką odpowiedź. Mam prawie całą dokumentację, ale nie mogę znaleźć przykładów ze wskaźnikiem do tablicy. – user1557786
To Lua, nie LUA. To nie jest akronim; to jest imię. –