lua-入门
Lua是动态类型语言,变量不要类型定义,区分大小写。 变量使用 字母或下划线开头,后面加字母,数字或下划线。
Lua中有8个基本类型分别为: nil、 boolean、
number、string、userdata、function、thread和 table。函数 type 可以测试给定变量或者值的类型。
目前使用版本 5.3
数值支持两种类型:64bit integers,双精度浮点类型 floats
根据想编译静态库还是动态库,新建对应的 vs 工程,把 lua 源文件加入进去,编译即可。
注释
-- 两个减号是行注释 |
数值
Lua的数字只有double型,64bits
num = 1024 |
字符串
不是 0 结尾的,可以包含任意二进制数据, 所以 lua_pushlstring 需要长度参数。
对于 0 结尾的,可以使用 lua_pushstring 传入,它使用 strlen 来获取长度
字符串你可以用单引号,也可以用双引号,还支持C类型的转义,比如: ‘\a’ (响铃), ‘\b’ (退格), ‘\f’ (表单), ‘\n’ (换行), ‘\r’ (回车), ‘\t’ (横向制表), ‘\v’ (纵向制表), ‘\’ (反斜杠), ‘\”‘ (双引号), 以及 ‘\” (单引号)
下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)
a = 'alo\n123"' |
拼接
str = "a1".."_a2" |
_G 说明
保存全局环境变量的
输出
for n in pairs(_G) do print(n) end |
空
C语言中的NULL在Lua中是nil,比如下面的v的值就是nil
v = UndefinedVariable |
作用域
另外,需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里。变量前加local关键字的是局部变量。
theGlobalVar = 50 |
while循环
sum = 0 |
for 循环
从1加到100
sum = 0 |
从1到100的奇数和
sum = 0 |
从100到1的偶数和
sum = 0 |
until循环
sum = 2 |
if-else分支
if age == 40 and sex =="Male" then |
上面的语句不但展示了if-else语句,也展示了
1)“~=”是不等于,而不是!=
2)io库的分别从stdin和stdout读写的read和write函数
3)字符串的拼接操作符“..”
另外,条件表达式中的与或非为分是:and, or, not关键字。
函数
递归
function fib(n) |
闭包
function newCounter() |
函数的返回值
可以一条语句上赋多个值,如:
name, age, bGay = "haoel", 37, false, "haoel@hotmail.com" |
上面的代码中,因为只有3个变量,所以第四个值被丢弃。
函数也可以返回多个值:
function getUserInfo(id) |
注意:上面的示例中,因为没有传id,所以函数中的id输出为nil,因为没有返回bGay,所以bGay也是nil。
局部函数
函数前面加上local就是局部函数
function foo(x) return x^2 end |
Table
所谓Table其实就是一个Key Value的数据结构
table的索引(index)是从1开始的。
haoel = {name="ChenHao", age=37, handsome=True} |
遍历
for k, v in pairs(t) do |
数组
arr = {10,20,30,40,50} |
MetaTable 和 MetaMethod
MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式的功能。
比如,我们有两个分数:
fraction_a = {numerator=2, denominator=3} |
我们想实现分数间的相加:2/3 + 4/7,我们如果要执行: fraction_a + fraction_b,会报错的。
所以,我们可以动用MetaTable,如下所示:
fraction_op={} |
为之前定义的两个table设置MetaTable:(其中的setmetatble是库函数)
setmetatable(fraction_a, fraction_op) |
于是你就可以这样干了:(调用的是fraction_op.__add()函数)
fraction_s = fraction_a + fraction_b |
至于__add这是MetaMethod,这是Lua内建约定的,其它的还有如下的MetaMethod:
__add(a, b) 对应表达式 a + b |
全局变量
Lua把这些全局变量放在了一个叫“_G”的Table里
_G.globalVar |