从元表字段/方法访问数组索引。
2014-6-16 18:9:47
收藏:0
阅读:75
评论:1
我有一些元表,反映了一些 C++ 类/结构体。通常我依靠 __index 来调用任何对象的字段/方法并在一个函数中解决它们。
我的困难是当我想要将参数传递给字段时,就像这样:
anim = playerInfo.animations
while anim do
print (anim)
numstates = anim.numstates
for i = 1, numstates do
state = anim.states(i) <--- 这一行就是问题所在
print(state)
end
anim = anim.next
end
这是相关的 C 代码:
static const struct luaL_Reg objanimationlib_m[] = {
{"__tostring", objanimation2string},
{"__index", objanimationget},
{"__newindex", objanimationset},
{NULL, NULL}
};
luaL_newmetatable(L, "objanimation");
lua_pushvalue(L, -1); // 重复元表
luaL_setfuncs(L, objanimationlib_m, 0);
在 __index 函数内部:
else if (!strcmp(field, "states"))
{
int number = (int)luaL_checknumber(L, 3) - 1; // -1 因为 Lua 不是基于 0 的
if (number >= anim->numstates)
return 0;
PushUserdata(&anim->states[number], "objstate");
}
运行脚本,我收到了一个错误:
Warning: [string "test.lua"]:13: bad argument #3 to '__index' (number expected, got no value)
我觉得我错过了一些愚蠢的简单东西。是什么呢?
编辑:这是我的解决方案,在 __index 函数内部:
else if (!strcmp(field, "states"))
{
lua_newtable(L);
int i;
for (i = 0; i < anim->numstates; i++)
{
PushUserdata(&anim->states[i], "objstate");
lua_rawseti(L, -2, i+1);
}
}
这将返回一个充满 userdata 元素的表。可能很昂贵,因此这也会增加性能:
anim = playerInfo.animations
while anim do
print (anim)
numstates = anim.numstates
states = anim.states
for i = 1, numstates do
print(states[i])
end
anim = anim.next
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
state = anim.states(i)等同于do local f=anim.states; state=f(i) end, 所以你的元方法永远不会看到i。换句话说,索引元方法接收两个参数,即表和键。它返回的内容不一定受到任何元方法的影响,除非你显式地这样做。
我会定义
__len返回numstates并定义__call处理anim.states(i),这样你的代码就可以这样写:for i = 1, #anim do state = anim(i) print(state) end