标签: lua-userdata

如何从Delphi中注册Lua userdata?

我仍然对将Delphi userdata注册到Lua感到困惑.教我学习实现日期(时间)类型的原则.

开头这个类型应该有Lua可以访问的三个函数:

  1. 一个new函数来创建此类型的变量.
  2. 一个getdate功能.
  3. 和一个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)

delphi lua lua-userdata

8
推荐指数
1
解决办法
704
查看次数

从纯Lua创建新的空userdata

我想我在Lua中看到了一个可以返回新用户数据的本地函数.它存在吗?是否可以从普通的Lua脚本创建自定义用户数据?

lua lua-userdata

6
推荐指数
1
解决办法
2669
查看次数

Lua userdata数组访问和方法

我用C语言编写了一个用于Lua的userdata类型.它有一些数组类型属性和各种方法.现在,如果你是这种类型,我使用u:set(k,v)resp.u:get(k)访问数据和例如u:sort()作为方法.为此,我设置__index了一个包含这些方法的表.现在,如果我想用访问数据u[k] = v或者u[k],我需要设置__newindex__indexsetRESP 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 lua-api lua-userdata

4
推荐指数
1
解决办法
2834
查看次数

Lua绑定:table vs userdata

在为C++类创建Lua绑定时,我应该返回表还是userdata对象?

有谁知道每种方法的优缺点?

lua binding lua-table lua-userdata

3
推荐指数
1
解决办法
1689
查看次数

如何释放lua_newuserdata使用delete运算符分配的内存?

我怎样才能释放分配的内存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)

但是我遇到了分段错误.

c++ lua memory-management lua-userdata

3
推荐指数
1
解决办法
1495
查看次数

在Lua中访问Light userdata

我可能误解了它们的使用或误读了文档,但是如何访问作为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代码是什么样的?

c++ lua lua-userdata

2
推荐指数
1
解决办法
4398
查看次数

向userdata添加方法

我正在尝试向这样的现有用户数据添加一个方法,但这对我来说是一个错误.

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添加到现有的用户数据

java lua lua-userdata

2
推荐指数
1
解决办法
914
查看次数

保存对Lua的userdata的引用

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

c lua lua-userdata

1
推荐指数
1
解决办法
2525
查看次数

如何在C++中将userdata从一个Lua块传递到另一个Lua块

我试图userdatachunk 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)

c++ lua swig lua-userdata

1
推荐指数
1
解决办法
408
查看次数

标签 统计

lua ×9

lua-userdata ×9

c++ ×3

c ×2

binding ×1

delphi ×1

java ×1

lua-api ×1

lua-table ×1

memory-management ×1

swig ×1