加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

介绍LuaPlus: 好用的Lua For C++扩展(修订)

发布时间:2020-12-14 22:21:21 所属栏目:大数据 来源:网络整理
导读:LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作,是比较好的一个选择。 LuaPlus目前版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28,2004)。大家可以到 http://luaplus.org/?站点下
LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作,是比较好的一个选择。
LuaPlus目前版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28,2004)。大家可以到 http://luaplus.org/?站点下载:
源码?? ( http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip)
目标码 ( http://wwhiz.com/LuaPlus/LuaPlus50_Build1081_Win32Binaries.zip)

介绍LuaPlus: 好用的Lua For C++扩展??????沐枫网志?

[由于lua内核升级到5.1,因此,luaplus也同样跟着升级。最新的luaplus可以通过svn获取,地址 svn://svn.luaplus.org/LuaPlus/work51,
同时,luaplus基于5.0的内核仍然在维护更新,也可以通过svn获取,地址 svn://svn.luaplus.org/root/LuaPlus/Dev ]

我将在下面说明,如何使用LuaPlus,以及如何更方便的让LuaPlus与C++的类合作无间。

1. 调用Lua脚本

?

???? // ?创建Lua解释器:

????LuaStateOwner?state;?

????

????
?执行Lua脚本: ????state -> DoString( " print('Hello?Worldn') );

????
?载入Lua脚本文件并执行: DoFile( C:test.lua ?载入编译后的Lua脚本文件并执行: C:test.luac );


2. 与Lua脚本互相调用

?为Lua脚本设置变量 GetGlobals().SetNumber( myvalue ,? 123456 ?获得Lua变量的值 int ?myvalue? = ?state GetGlobal( ).GetInteger();

????

????
?调用Lua函数 ????LuaFunction < > ?luaPrint? print );

????luaPrint(
Hello?Worldn );

????

????
?让Lua调用C语言函数

?add( ?a,0)">?b) {?return?a+b;}

????state
GetGlobals().RegisterDirect( add

????state
print(add(3,4)) ?让Lua调用C++类成员函数

class ?Test {public:?int?add(?b)b;}} ;

????Test?test;

????state

????state
);

????
3. 在Lua脚本中使用C++类
????
??? 这个稍微有点小麻烦。不过,我包装了一个LuaPlusHelper.h的文件,它可以很轻松的完成这个工作。它的实现也很简单,大家可以从源码上来获得如何用纯LuaPlus实现同样的功能。
??? 不过,这里仍然有一个限制没有解决:不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。
??? 另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。?

?下面是一个简单的C++类:???? ? ?Logger

?
{

?
:

??
void?LOGMEMBER(const?char*?message)

??
{

???printf(
"In?member?function:?%sn

??}

?

??Logger()

??
Constructing(%p)

n
this);

???v?
=10;

??}

??
virtual~Logger()

??
Destructing(%p)

n
);

??}

?

??Logger(
?n)

??
?--?Constructing[%d](%p)

n

??Logger(Logger
?logger)

??
?--?Constructing[%p](%p)

n
);

???logger
->LOGMEMBER(?Call?From?Constructorn?SetValue(?val)

??
{

???v?
?val;

??}
?GetValue()

??
{

???
?v;

??}

?
?v;

?}
;

?

?导入到Lua脚本: ????LuaClass Logger (state)

???????.create(
)? ?定义构造函数?Logger::Logger() ???????.create ( Logger2 )?? ?定义构造函数?Logger::Logger(int) *> Logger3 ?定义构造函数?Logger::Logger(Logger*)

??????
?.destroy( Free ?定义析构函数?Logger::~Logger() ???????.destroy( __gc ???????.def( lm & Logger::LOGMEMBER)?? ?定义成员函数?Logger::LOGMEMBER(const?char*) SetValue Logger::SetValue)

???????.def(
GetValue Logger::GetValue);

?

?在Lua中使用Logger类(1): DoString(

????????
l?=?Logger(); ?? ?调用构造函数?Logger::Logger() ???????? l:lm('Hello?World?1'); ?调用成员函数?Logger::LOGMEMBER(const?char*) l:Free(); ?调用析构函数?Logger::~Logger() ????????);

?

?在Lua中使用Logger类(2): m?=?Logger2(10); ?调用构造函数?Logger::Logger(int) m:lm('Hello?World?2'); n?=?Logger3(m); ?调用构造函数?Logger::Logger(Logger*) n:lm('Hello?World?3'); m:SetValue(11);

????????
print(m.GetValue()); m,n?=?nil,?nil; ?m,n?将由Lua的垃极回收来调用析构函数 ????????);


4. 将一组C函数归类到Lua模块

?

同上面一样,我采用LuaPlusHelper.h来简化: ????LuaModule(state,0)">mymodule )

???????.def(

???????.def(
add2

?

????state
print(mymodule.add(3,4)); print(mymodule.add2(3,0)">

????????);


5. 使用Lua的Table数据类型

?在Lua中创建Table ????LuaObject?table? GetGlobals().CreateTable( mytable );

????table.SetInteger(
m 10 );

????table.SetNumber(
f 1.99 );

????table.SetString(
s Hello?World );

????table.SetWString(
ch 你好 1 What ?相当于Lua中的:

????
?mytable?=?{m=10,?f=1.99,?s="Hello?World",?ch=L"你好",?"What"}

??

?也可以使用table作为key和value: nexttable )

????????.SetString(table,0)">Hello
)

????????.SetObject(
obj

????
?nexttable?=?{mytable="Hello",?obj=mytable}

?

获得Table的内容: ????LuaObject?t2? GetGlobals( ?m? ?t2.GetByName( ).GetInteger();

????

????LuaObject?t3?
);

????std::
string ?str? ?t3.GetByObject(t2).GetString();

????
6? 遍历Table

?

?LuaStateOwner?state;

?state.DoString(? MyTable?=?{?Hi?=?5,?Hello?=?10,?Yo?=?6?} ?);

?

?LuaObject?obj?
?state.GetGlobals()[? MyTable ?];

?
for ?(?LuaTableIterator?it(?obj?);?it;?it.Next()?)

?
{

?????
?key??it.GetKey().GetString();

?????
?num??it.GetValue().GetInteger();

?}


篇尾

上面我只是简单的举一些例子来说明LuaPlus以及LuaPlusHelper的使用方法,具体文档请参见LuaPlus。

需要下载LuaPlusHelper,请点这里:
http://files.cnblogs.com/ly4cn/LuaPlusHelper.rar

测试程序(VC7.1):
http://files.cnblogs.com/ly4cn/LuaPlusTest.rar

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读