# 【Lua基础】

官网 (opens new window)

内置函数 (opens new window)

在线测试Lua (opens new window)

# 简单示例

最简单的Lua程序

-- 两个减号后面是注释
print("hello world")

# 变量声明

-- 全局变量
a = "A"

-- 局部变量
local b = "B"

-- 没有被声明的变量都是 nil
print(c)
-- 多重赋值
a,b = 1,2
print(a,b)

# 数值类型

-- 十进制
a = 100

-- 十六进制
b = 0x11

-- 科学计数法,例如下面的值是2 00000 00000
c = 2e10

-- 支持位移运算符,例如1左移3位结果为8
print(1<<3)

# 字符串类型

a = "this is string value"

-- 支持换行转义
b = "abc\nABC"

print(a,b)
-- 使用双中括号可以定义多行文本
a = [[这是任意的多行文本
还支持换行
转义字符\n不会被转义]]
print(a)
-- 使用 .. 进行字符串连接
print("我今年" .. "18" .. "岁")
-- 字符串转数值型
str2num = tonumber("10")
print(str2num + 8)

-- 数值型转字符串
num2str = tostring(1.8)
print(num2str .. "m")
a = "hello world"
-- 输出的长度是11
print("字符串长度是:" .. #a)

# 函数类型

-- 定义方式A
function print_my_age(age)
    print("我今年" .. age .. "岁")
end
print_my_age(18)
-- 定义方式B
add_func = function(a,b)
    local result = a + b
    print("a + b = " .. result)
    return result
end
add_func(2,3)
-- 支持多重返回值
add_func = function(a,b)
    local result = a + b
    return a,b,result
end
local a,b,r = add_func(2,3)
print("a = " .. a .. " b = " .. b .. " r = " .. r)

# Table类型

可以表示数组或者字典

当成数组的使用方式:

-- Table 可以储存数值,字符串,还有函数
local tab = {1,"b",function() print("c") end}

-- Table 里,数组的第一个值的索引下标是 1 开始的,这点需要注意。
tab[3]() -- 这里会调用函数输出c

tab[4] = "d" -- 可以直接利用索引添加值

table.insert(tab,"e") -- 利用自带函数添加数据到数组后面
table.insert(tab,2,"b") -- 也可以在指定下标位置插入数据
table.remove(tab,2) -- 删除指定下标处的数据

print("tab 的长度为" .. #tab) -- tab 的长度为5

当成字典的使用方式:

local dic = {
    a = "A",
    b = "B",
    ["c"] = "C"
}
dic["d"] = "D"
print(dic.a)
print(dic["b"])
print(dic["c"])
print(dic.d)

# 全局 _G

print(_G)

a = "A"
print(_G["a"])

print(_G["table"]["insert"])

# 布尔类型

需要注意的是Lua 里 false 和 nil 表示假,否则表示真。就是说 0 也是表示真。

常规比较运算符

print("1>2:" .. tostring(1 > 2))-- 1>2:false
print("1<2:" .. tostring(1 < 2))-- 1<2:true
print("1>=2:" .. tostring(1 >= 2))-- 1>=2:false
print("1<=2:" .. tostring(1 <= 2))-- 1<=2:true
print("1==2:" .. tostring(1 == 2))-- 1==2:false
-- 需要注意的是不等于用 ~= 而不是 !=
print("1~=2:" .. tostring(1 ~= 2))-- 1~=2:true

且或非运算符

需要注意的是 and 和 or 返回的是 a 或者 b 的具体值,而不是只有true false。

可以利用这个特性进行短路求值。

local a = true
local b = false
print("a and b => " .. tostring(a and b)) -- false
print("a or b => " .. tostring(a or b))   -- true
print("not a => " .. tostring(not a))     -- false

# 分支

if 1 > 10 then
    print("1 > 10")
elseif 1 < 10 then
    print("1 < 10")
else 
    print("no")
end

# 循环

基本

for i=1,10 do
    print("i:" .. i)
end

加上步长2,则输出 1,3,5,7,9

for i=1,10,2 do
    print("i:" .. i)
end

可以使用 break 跳出循环 例子输出 1,2,3,4

for i=1,10 do
    if i == 5 then break end
    print("i:" .. i)
end

while 循环

-- 例子输出 4,3,2,1
local i = 5
while i > 1 do
    i = i - 1
    print("i:" .. i)
end