Lua脚本式编程

1.4k 词

1.基本语法

单行注释:–
多行注释:–[[ 内容–]]

lua最好不要使用下划线加大字母的标识符,因为lua的保留字是这样的。
lua不允许使用特殊字符如@$%来定义标志符。

默认情况下,变量总是认为全局。
删除全局变量,只需要将变量赋值nil .

lua的数据类型:nil 、boolean、number、string、userdata、function、thread和table。

nil作为比较时应该加上双引号,例如

1
2

type(x) == "nil"

boolean类型只有两个可选值:true 和 false
lua把false和nil看作是“假”,其他都为真。

number(数字):lua只有一种number类型,double双精度类型,默认类型可以修改luaconf.h里面的定义。

string(字符串):由一对双引号或单引号来表示,也可以用2个方括号“[[ ]]”来表示“一块”字符串。

对一个数字字符串上进行算术操作时,lua会尝试将这个数字字符串转换成一个数字。

1
2
print(“2”+6)   8.0
print("2"+"6") 8.0

字符串连接使用的是 . .如:

1
2
print("a" .. "b")  ab
print(157 .. 428) 157428

#计算字符串的长度。

1
2
3
len ="www.runoob.com"
print(#len) 14
print(#"www.runoob.com") 14

2.宿主语言C/C++

==虚拟栈==
无论何时lua调用C,被调用的函数都得到一个新的栈,这个栈独立于C函数本身的栈,也独立于之前的栈。
方便起见,所有正对栈的API查询操作都不严格遵守栈的操作规则。而是可以用一个索引来指向栈上的任何元素:
==正的索引指的是栈上的绝对位置(从1开始),负的索引指从栈顶开始的偏移量。==

Lua_checkstack:扩大可用堆栈的尺寸
LUA_MINSTACK一般被定义为20。

压入栈的数据类型包括数值、字符串、指针、table、闭包。

Diagram

Lua_pushcclosure(L,func,0);创建并压入一个闭包
Lua_createtable(L,0,0);新建并压入一个表
Lua_pushnumber(L,343);压入一个数字
Lua_pushstring(L,”Nystr”);压入一个字符串

Lua中,number、boolean、nil、lightuserdata四种类型的值是直接存在栈上元素里和垃圾回收无关。
Lua中,string、table、closure、userdata、thread存在栈上元素里的只是指针,他们都会在生命周期结束后被垃圾回收。

Lua_push族函数都有“创建一个类型的值并压入”的语义。
Lua value -> C value时,是通过Lua_to
族api实现的。

1
2
3
4
5
6
取表中元素 
void lua_getfield(lua_state *L,int index,const char *K)
操作: arr = stack[index]
stack.push(arr[K])
取表中键为K的元素,这里的表是由index指向的栈上的一个表。
栈高度+1,栈顶元素是(stack[index])[K]。