如何使用Lua C API绑定C成员方法和成员变量实现长尾词?

2026-04-01 20:241阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计675个文字,预计阅读时间需要3分钟。

如何使用Lua C API绑定C成员方法和成员变量实现长尾词?

到目前为至,我所做的所有谷歌搜索都显示出了非常接近的事件,但并非因为我正在努力做的事情。让我以最基本的方式描述一下:想象一下你有一门C++的A类,它有一个public的int类型的Method()方法和一个int类型的Variable。

如何使用Lua C API绑定C成员方法和成员变量实现长尾词?

到目前为止,我所做的所有谷歌搜索都发现了非常接近的事情,但并不是因为我正在努力做的事情.

让我以最基本的方式描述这个:

>想象一下你有一个C级

class A { public: int Method(); int Variable; };

>现在想象你实例化A * Foo;
>现在假设你有一个带有这个3行函数的.lua文件:

function Test() local n = Foo:Method(); Foo.Variable = 0; local m = Foo.Variable; end

如何将对象A *绑定到lua,以便所有这些都可行?

伪代码,我的第一次尝试是这样的,部分来自复制粘贴的例子:

>在一个只调用一次的函数中,无论A的实例数是多少:

>创建newmetatable(MT)
> pushvalue(-1)(我真的没有这个)
> setfield(-2,“__ index”)
> pushcfunction,带有静态版本的Method,从checkudata解包A *指针
> setfield(-2,“方法”)

>在为每个实例调用的init函数中,例如富:

>使用newuserdata创建指向Foo的指针
> setmetatable(MT)
>使用Foo setglobal使名称可用于lua

>在main中的测试函数中:

>按照全球名称,使用上面提到的3行.lua测试功能

这样做时,Foo:Hide();成功调用了我的静态函数,它成功解压缩指针并调用其成员Hide().

到目前为止很好:Method().

然后我尝试支持.Variable访问.每个人似乎都说要再次使用metatables来覆盖__index和__newindex,并使它们成为一种通用的Get / Set,在这里你可以将某些键支持为有效的变量链接,例如: if(key ==“Variable”)Variable = val;

这也很好.

问题是试图把这两件事放在一起.只要使用适用于Variable的getter / setter覆盖__index / __ newindex,Method()调用就不再调用Method()静态函数,而是进入你绑定的__index函数.

所有这些都说,如何支持这种看似基本的用例组合?

实际的代码片段比纯粹的理论喋喋不休更受欢迎.

提醒:请仅使用基本的C API进行回复,而不是第三方的回复.

the Method() call no longer calls the Method() static function, but
goes into the __index function you bound instead.

所以对它进行编程,以便如果表中存在键,则首先返回,否则请使用getter / setter.

本文共计675个文字,预计阅读时间需要3分钟。

如何使用Lua C API绑定C成员方法和成员变量实现长尾词?

到目前为至,我所做的所有谷歌搜索都显示出了非常接近的事件,但并非因为我正在努力做的事情。让我以最基本的方式描述一下:想象一下你有一门C++的A类,它有一个public的int类型的Method()方法和一个int类型的Variable。

如何使用Lua C API绑定C成员方法和成员变量实现长尾词?

到目前为止,我所做的所有谷歌搜索都发现了非常接近的事情,但并不是因为我正在努力做的事情.

让我以最基本的方式描述这个:

>想象一下你有一个C级

class A { public: int Method(); int Variable; };

>现在想象你实例化A * Foo;
>现在假设你有一个带有这个3行函数的.lua文件:

function Test() local n = Foo:Method(); Foo.Variable = 0; local m = Foo.Variable; end

如何将对象A *绑定到lua,以便所有这些都可行?

伪代码,我的第一次尝试是这样的,部分来自复制粘贴的例子:

>在一个只调用一次的函数中,无论A的实例数是多少:

>创建newmetatable(MT)
> pushvalue(-1)(我真的没有这个)
> setfield(-2,“__ index”)
> pushcfunction,带有静态版本的Method,从checkudata解包A *指针
> setfield(-2,“方法”)

>在为每个实例调用的init函数中,例如富:

>使用newuserdata创建指向Foo的指针
> setmetatable(MT)
>使用Foo setglobal使名称可用于lua

>在main中的测试函数中:

>按照全球名称,使用上面提到的3行.lua测试功能

这样做时,Foo:Hide();成功调用了我的静态函数,它成功解压缩指针并调用其成员Hide().

到目前为止很好:Method().

然后我尝试支持.Variable访问.每个人似乎都说要再次使用metatables来覆盖__index和__newindex,并使它们成为一种通用的Get / Set,在这里你可以将某些键支持为有效的变量链接,例如: if(key ==“Variable”)Variable = val;

这也很好.

问题是试图把这两件事放在一起.只要使用适用于Variable的getter / setter覆盖__index / __ newindex,Method()调用就不再调用Method()静态函数,而是进入你绑定的__index函数.

所有这些都说,如何支持这种看似基本的用例组合?

实际的代码片段比纯粹的理论喋喋不休更受欢迎.

提醒:请仅使用基本的C API进行回复,而不是第三方的回复.

the Method() call no longer calls the Method() static function, but
goes into the __index function you bound instead.

所以对它进行编程,以便如果表中存在键,则首先返回,否则请使用getter / setter.