我仍然对将Delphi userdata注册到Lua感到困惑.教我学习实现日期(时间)类型的原则.
开头这个类型应该有Lua可以访问的三个函数:
new函数来创建此类型的变量.getdate功能.setdate功能.最后这个小Lua脚本应该工作:
DT = DateTime.new()
DT:setdate(1, 1, 2011)
day, month, year = DT:getdate()
print("Day: " .. day .. " Month: " .. month .." Year: " .. year)
Run Code Online (Sandbox Code Playgroud)
我试图自己实现它(使用Lua中的Programming),但是我收到一条错误说:_attempt to index global 'DT' (a userdata value)_第2行.我可能在用户数据注册时出错了但我找不到错误.
我希望你能帮助我找到它,这是我已经得到的:
Const
MetaPosDateTime = 'DateTime';
Type
tLuaDateTime = tDateTime;
pLuaDateTime = ^tLuaDateTime;
Function newdatetime(aState : pLua_State) : longint; cdecl;
Var
NewData : pLuaDateTime;
Begin
Result := 0; …Run Code Online (Sandbox Code Playgroud) 我想我在Lua中看到了一个可以返回新用户数据的本地函数.它存在吗?是否可以从普通的Lua脚本创建自定义用户数据?
我用C语言编写了一个用于Lua的userdata类型.它有一些数组类型属性和各种方法.现在,如果你是这种类型,我使用u:set(k,v)resp.u:get(k)访问数据和例如u:sort()作为方法.为此,我设置__index了一个包含这些方法的表.现在,如果我想用访问数据u[k] = v或者u[k],我需要设置__newindex和__index对setRESP get.但是其他方法再也无法访问了......
在C中处理这个问题的最佳方法是什么?我猜我需要在C中编写一个函数来注册,__index并以某种方式在那里处理它.也许检查密钥是否属于Lua方法表,如果是,则调用它.
任何帮助/提示将不胜感激.我没有找到这样的例子,虽然这对我来说似乎是很自然的事情.
编辑: 在Lua中添加了我的C版解决方案,在下面的答案中发布.这或多或少都是直接翻译,所以所有功劳都归功于@ gilles-gregoire.
以下C函数注册为__index元方法.
static int permL_index(lua_State *L) {
struct perm **pp = luaL_checkudata(L, 1, PERM_MT);
int i;
luaL_getmetatable(L, PERM_MT);
lua_pushvalue(L, 2);
lua_rawget(L, -2);
if ( lua_isnil(L, -1) ) {
/* found no method, so get value from userdata. */
i = luaL_checkint(L, 2);
luaL_argcheck(L, 1 <= i && i <= (*pp)->n, 2, …Run Code Online (Sandbox Code Playgroud) 在为C++类创建Lua绑定时,我应该返回表还是userdata对象?
有谁知道每种方法的优缺点?
我怎样才能释放分配的内存lua_newuserdata?
我有一个名为类Foo,这个类有一个构造函数和desstructor,我需要执行两个,但我不知道如何使用C++运算符delete,因为我没有使用new分配内存.
我尝试在创建对象的Lua函数new中执行此操作:
Foo *pf = reinterpret_cast<Foo *>(
lua_newuserdata(L, sizeof(Foo)));
Run Code Online (Sandbox Code Playgroud)
并在gc函数我试过:
Foo *foo = reinterpret_cast<Foo *>(lua_touserdata(L, 1));
delete foo;
Run Code Online (Sandbox Code Playgroud)
但是我遇到了分段错误.
我可能误解了它们的使用或误读了文档,但是如何访问作为light userdata传递给Lua的结构或类的成员?例如,如果一个向量使用以下结构
typedef struct Foo {
int x;
int y;
} Foo;
Run Code Online (Sandbox Code Playgroud)
被声明为'test'并定义为x = 413和y = 612,并且通过调用推送
lua_pushlightuserdata( L, (void *) &test ) ;
Run Code Online (Sandbox Code Playgroud)
操作或打印x和y的函数的Lua代码是什么样的?
我正在尝试向这样的现有用户数据添加一个方法,但这对我来说是一个错误.
local userData = luajava.newInstance("Objects.Block") --creates a userdata from a Java class
userData.newMethod = function()
-- Do stuff
end
Run Code Online (Sandbox Code Playgroud)
我在网站上找到了这个例子,但它也不起作用
local userData = luajava.newInstance("Objects.Block")
local mt = getmetatable(userData)
mt.__index.newMethod = function()
-- Do stuff
end
Run Code Online (Sandbox Code Playgroud)
是否有一种方法/功能从Lua添加到现有的用户数据
#1 Lua:
local test = Test();
Run Code Online (Sandbox Code Playgroud)
#2 C:
//creating "lua's test"
luaL_newmetatable(L, "someTable");
lua_userdata *userData = (lua_userdata *)lua_newuserdata(L, sizeof(lua_userdata));
luaL_getmetatable(L, "someTable");
lua_setmetatable(L, -2);
Run Code Online (Sandbox Code Playgroud)
#3 Lua:
function test.newMethod()
end
Run Code Online (Sandbox Code Playgroud)
#4 C:
//this part is not executed from Lua
//what i have to have here from #2 to call "test.newMethod" and how to call it?
//if userdata would be on stack i guess i could:
luaL_getmetafield (L, 1, "newMethod");
lua_call(L, 0, 0);
//but because this part is not executed by Lua call …Run Code Online (Sandbox Code Playgroud) 我试图userdata从chunk AC++中的Lua脚本()(通过我的示例中的函数返回的变量)获取然后,然后从C++(通过我的示例中的函数参数)将其传递userdata回Lua脚本(chunk B),以便userdata可以chunk B像在原来一样使用chunk A.
MyBindings.h
class Vec2
{
public:
Vec2():x(0), y(0){};
Vec2(float x, float y):x(x), y(y){};
float x, y;
};
Run Code Online (Sandbox Code Playgroud)
MyBindings.i
%module my
%{
#include "MyBindings.h"
%}
%include "MyBindings.h"
Run Code Online (Sandbox Code Playgroud)
main.cpp
#include <iostream>
#include <lua.hpp>
extern "C"
{
int luaopen_my(lua_State *L);
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaopen_my(L);
lua_settop(L, 0);
/* chunk A */
luaL_dostring(L, "local vec2 = my.Vec2(3, 4)\n"
"function setup()\n"
"return …Run Code Online (Sandbox Code Playgroud)