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
num = 3.0
num = 3.1416
num = 314.16e-2
num = 0.31416E1
num = 0xff
num = 0x56

字符串

不是 0 结尾的,可以包含任意二进制数据, 所以 lua_pushlstring 需要长度参数。
对于 0 结尾的,可以使用 lua_pushstring 传入,它使用 strlen 来获取长度

字符串你可以用单引号,也可以用双引号,还支持C类型的转义,比如: ‘\a’ (响铃), ‘\b’ (退格), ‘\f’ (表单), ‘\n’ (换行), ‘\r’ (回车), ‘\t’ (横向制表), ‘\v’ (纵向制表), ‘\’ (反斜杠), ‘\”‘ (双引号), 以及 ‘\” (单引号)

下面的四种方式定义了完全相同的字符串(其中的两个中括号可以用于定义有换行的字符串)

a = 'alo\n123"'
a = "alo\n123\""
a = '\97lo\10\04923"'
a = [[alo
123"]]

拼接

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
local theLocalVar = "local variable"

while循环

sum = 0
num = 1
while num <= 100 do
sum = sum + num
num = num + 1
end
print("sum =",sum)

for 循环

从1加到100

sum = 0
for i = 1, 100 do
sum = sum + i
end

从1到100的奇数和

sum = 0
for i = 1, 100, 2 do
sum = sum + i
end

从100到1的偶数和

sum = 0
for i = 100, 1, -2 do
sum = sum + i
end

until循环

sum = 2
repeat
sum = sum ^ 2 --幂操作
print(sum)
until sum >1000

if-else分支

if age == 40 and sex =="Male" then
print("男人四十一枝花")
elseif age > 60 and sex ~="Female" then
print("old man without country!")
elseif age < 20 then
io.write("too young, too naive!\n")
else
local age = io.read()
print("Your age is "..age)
end

上面的语句不但展示了if-else语句,也展示了
1)“~=”是不等于,而不是!=
2)io库的分别从stdin和stdout读写的read和write函数
3)字符串的拼接操作符“..”

另外,条件表达式中的与或非为分是:and, or, not关键字。

函数

递归

function fib(n)
if n < 2 then return 1 end
return fib(n - 2) + fib(n - 1)
end

闭包

function newCounter()
local i = 0
return function() -- anonymous function
i = i + 1
return i
end
end

c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2


function myPower(x)
return function(y) return y^x end
end

power2 = myPower(2)
power3 = myPower(3)

print(power2(4)) --4的2次方
print(power3(5)) --5的3次方

函数的返回值

可以一条语句上赋多个值,如:

name, age, bGay = "haoel", 37, false, "haoel@hotmail.com"

上面的代码中,因为只有3个变量,所以第四个值被丢弃。

函数也可以返回多个值:

function getUserInfo(id)
print(id)
return "haoel", 37, "haoel@hotmail.com", "https://coolshell.cn"
end

name, age, email, website, bGay = getUserInfo()

注意:上面的示例中,因为没有传id,所以函数中的id输出为nil,因为没有返回bGay,所以bGay也是nil。

局部函数

函数前面加上local就是局部函数

function foo(x) return x^2 end
foo = function(x) return x^2 end

Table

所谓Table其实就是一个Key Value的数据结构
table的索引(index)是从1开始的。

haoel = {name="ChenHao", age=37, handsome=True}

haoel.website="https://coolshell.cn/"
local age = haoel.age
haoel.handsome = false
haoel.name=nil

遍历

for k, v in pairs(t) do
print(k, v)
end

数组

arr = {10,20,30,40,50}
-- 等价于
arr = {[1]=10, [2]=20, [3]=30, [4]=40, [5]=50}
-- 可以定义不同类型的数组 其中的函数可以这样调用:arr[4]()。
arr = {"string", 100, "haoel", function() print("coolshell.cn") end}

for i=1, #arr do
print(arr[i])
end

-- Lua的下标不是从0开始的,是从1开始的

MetaTable 和 MetaMethod

MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式的功能。

比如,我们有两个分数:

fraction_a = {numerator=2, denominator=3}
fraction_b = {numerator=4, denominator=7}

我们想实现分数间的相加:2/3 + 4/7,我们如果要执行: fraction_a + fraction_b,会报错的。

所以,我们可以动用MetaTable,如下所示:

fraction_op={}
function fraction_op.__add(f1, f2)
ret = {}
ret.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator
ret.denominator = f1.denominator * f2.denominator
return ret
end

为之前定义的两个table设置MetaTable:(其中的setmetatble是库函数)

setmetatable(fraction_a, fraction_op)
setmetatable(fraction_b, fraction_op)

于是你就可以这样干了:(调用的是fraction_op.__add()函数)

fraction_s = fraction_a + fraction_b

至于__add这是MetaMethod,这是Lua内建约定的,其它的还有如下的MetaMethod:

__add(a, b)                     对应表达式 a + b
__sub(a, b) 对应表达式 a - b
__mul(a, b) 对应表达式 a * b
__div(a, b) 对应表达式 a / b
__mod(a, b) 对应表达式 a % b
__pow(a, b) 对应表达式 a ^ b
__unm(a) 对应表达式 -a
__concat(a, b) 对应表达式 a .. b
__len(a) 对应表达式 #a
__eq(a, b) 对应表达式 a == b
__lt(a, b) 对应表达式 a < b
__le(a, b) 对应表达式 a <= b
__index(a, b) 对应表达式 a.b
__newindex(a, b, c) 对应表达式 a.b = c
__call(a, ...) 对应表达式 a(...)

全局变量

Lua把这些全局变量放在了一个叫“_G”的Table里

_G.globalVar
_G["globalVar"]