简单介绍一下Lua,建议最好通读过manual知道基本语法再阅读此文,再深入的话,建议每一步都主动思考动手练习这里的内容之后,才开始学习其他高级内容,比如协程、绑定、用户数据、内省、gc、闭包、upvalue等等。
C通过栈和少量命令与Lua通信,通信流程如下:
来看看具体操作,C API 示例:
/* 1.执行Lua脚本,返回0代表成功 */
int err = luaL_dofile(pL, "helloLua.lua");
CCLOG("open : %d", err);
/* 2.重置栈顶索引 */
lua_settop(pL, 0);
lua_getglobal(pL, "myName"); // 在global table中寻找myName
/* 3.判断栈顶的值的类型是否为String, 返回非0值代表成功 */
int isstr = lua_isstring(pL, 1);
CCLOG("isstr = %d", isstr);
/* 4.获取栈顶的值 */
const char* str = lua_tostring(pL, 1);
CCLOG("getStr = %s", str);
我们在使用lua c api的过程中,指定Lua栈上面的元素的序号是按照下面的方式排布的:
栈顶永远-1,栈底永远为1,简单记忆为“一直向上”(一值向上)
栈顶
-1 5
-2 4
-3 3
-4 2
-5 1
栈底
在Lua的世界里,一切魔法都是table造成的,通过基本元素组织起来,使得Lua非常优雅,基本的常见的元素如下,并且写了一些与c的不同:
赋值nil就是删除
出了false和nil之外都认为真,所以Lua认为0和空字符串都为真
Lua中数组下标从1开始
对C数据的包装
一些需要注意的基本语法:
Table除了简单的操作之外,还可以通过metatable提供更加方便的控制,为table增加metatable很简单
tab = {}
mt = {}
setmetatable(tab,mt)
metatable通过在约定的值去控制table,主要控制是
调用
这里只简单讲一下访问控制,当metatable中__index指向的table中存在要访问的元素,会优先访问该table,这就跟重载如出一辙,当然,你写入之后就会访问自己的数据,但在此之前,总会访问metatable的__index指向。注意__index除了可以指向table之外,还可以指向function,指向function会有更好的控制力度。其他类型的控制也雷同。
在Lua中没有直接提供面向对象,但是由于metatable的强大功能,所以可以轻松构造面向对象特性,Lua创建与传统面向对象不同的地方就是没有通过类去创建实例。在Lua中一切都是Table,包括我们认知中的类。其实类只是辅助我们思考的东西,在内存中并不直接存在,所以需要我们直接从Table构造出我们所需要的特性。这里可以看到作者的用心,更少的机制,更多的工作,简洁到极致。
类实际上是用来创建实例的,所以我们构造的Class,就是一种可以创建实例的方法
struct Foo{
int a;
int b;
void FooFunc(){}
};
function Foo()
local t = {}
t.a = 0
t.b = 0
t.FooFunc = function() end
return t
end
通过new出来实例,而不是通过调用函数得到,更符合我们的习惯
function Class()
local t = {}
t.__index = t
t.New = function()
local instance = {}
setmetatable(instance, t)
return instance
end
return t
end
Foo = Class()
Foo.a = 0
Foo.b = 0
Foo.FooFunc = function() end
继承的特点一个个进行分析
* 拥有父类的数据* 拥有父类的过程
struct Bar : public Foo{
int c;
};
function class(type)
local t = {}
t.__index = t
setmetatable(t, type)
t.New = function()
local instance = {}
setmetatable(instance, t)
return instance
end
return t
end
Bar = class(Foo)
Bar.c = 0
为了全局名字污染最小化,尽可能地使用局部变量,包括类名,因此有如下文件组织模版
local Test2 = Class(Test1)
Test2.func = function(aa,bb)
end
Test2.abc = "abc"
return Test2
在另外一份lua文件中,可以这么使用
local Test2 = require "Test2"
local Test3 = Class(Test2)
...
return Test3
原文:http://www.cnblogs.com/fonzieyang/p/3554843.html