lua 设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
运行文件 lua filename.lua 。
注释
单行注释 --
-- 注释
多行注释 --[[]]
--[[
    多行注释
    多行注释
]]
数据类型
| 数据类型 | 描述 | 
|---|---|
| nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 | 
| boolean | 包含两个值:false和true。 | 
| number | 表示双精度类型的实浮点数 | 
| string | 字符串由一对双引号或单引号来表示 | 
| function | 由 C 或 Lua 编写的函数 | 
| userdata | 表示任意存储在变量中的C数据结构 | 
| thread | 表示执行的独立线路,用于执行协同程序 | 
| table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 | 
通过 type 可以获取类型。
print(type("Hello world")) --> string  
print(type(10))            --> number  
print(type(print))         --> function  
print(type(type))          --> function  
print(type(true))          --> boolean  
print(type(nil))           --> nil  
print(type(type(X)))       --> string
nil
nil 类型表示一种没有任何有效值。未初始化或不存在的量值为 nil 。
boolean
Lua 把 false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true。
if 0 then
    print("0 is true")
else
    print("0 is false")
end
-- 0 is true
number
Lua 默认只有一种 number 类型 -- double(双精度)类型(默认类型可以修改 luaconf.h 里的定义。
string
定义:
a = "string1"
b = 'string2'
c = [[string3]]
字符串拼接:
print(10 .. 25)     -- 1025
print("10" .. "25") -- 1025
算数操作:
print("10" + "25") -- 35
print("10" * "25") -- 250
table
在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{}。
创建:
a = {}
b = { "x", "y", "z" }
使用:
a = {}
a["x"] = 10
print(a["x"]) -- 10
print(a["y"]) -- nil
a["x"] = nil  -- 删除
print(a["x"]) -- 10
function
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
变量
lua 变量默认为全局变量,使用 local 声明局部变量。
function test()
    a = 5
    local b = 10
end
test()
print(a, b) // 5  nil
swap
x, y = y, x
循环
while
语法:
while (condition) do
    statement
end
示例:
x = 0
while (x < 10) do
    print(x)
    x = x + 1
end
for
语法:
for var = exp1, exp2, exp3 do
    statement
end
exp1 为初始值,exp2 为终止值,exp3 为步长。
等价于 C++ for(int var = exp1; var <= exp2; i += exp3)。
示例:
for i = 0, 10, 2 do 
    print(i)
end
// 0 2 4 6 8 10 (注意含 10)
repeat until
语法:
repeat
    statement
until (condition)
当 condition 为 true 时退出循环。
示例:
x = 0
repeat
   print(x)
   x = x + 2
until (x > 10)
流程控制
语法:
if (condition) then
    statement
elseif (condition) then
    statement
else
    statement
end
注意 elseif 是连起来的。
示例:
x = 0
while (x < 10) do 
    if (x % 3 == 0) then
        print(x, "mod 3 is 0")
    elseif (x % 3 == 1) then
        print(x, "mod 3 is 1")
    else 
        print(x, "mod 3 is 2")
    end
    x = x + 1
end
函数
定义:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end
函数支持多返回值和可变参数。
示例:
local function max(a, b)
    if (a > b) then
        return a
    else 
        return b
    end
end
print(max(1, 2)) // 2
可变参数
利用 ... 表示可变参数。
示例:
local function max(a, ...)
    local res = a
    for _, v in ipairs{...} do
        if (v > res) then
            res = v
        end
    end    
    return res
end
print(max(1, 2))
print(max(1, 2, 3))
可以将参数转变为表再操作(args = {...})。
运算符
下表列出了 Lua 语言中的常用算术运算符,设定 A 的值为10,B 的值为 20:
| 操作符 | 描述 | 实例 | 
|---|---|---|
| + | 加法 | A + B 输出结果 30 | 
| - | 减法 | A - B 输出结果 -10 | 
| * | 乘法 | A * B 输出结果 200 | 
| / | 除法 | B / A 输出结果 2 | 
| % | 取余 | B % A 输出结果 0 | 
| ^ | 乘幂 | A^2 输出结果 100 | 
| - | 负号 | -A 输出结果 -10 | 
| // | 整除运算符(>=lua5.3) | 5//2 输出结果 2 | 
比较运算符:
| 操作符 | 描述 | 实例 | 
|---|---|---|
| == | 等于,检测两个值是否相等,相等返回 true,否则返回 false | (A == B) 为 false。 | 
| ~= | 不等于,检测两个值是否相等,不相等返回 true,否则返回 false | (A ~= B) 为 true。 | 
| > | 大于,如果左边的值大于右边的值,返回 true,否则返回 false | (A > B) 为 false。 | 
| < | 小于,如果左边的值大于右边的值,返回 false,否则返回 true | (A < B) 为 true。 | 
| >= | 大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false | (A >= B) 返回 false。 | 
| <= | 小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false | (A <= B) 返回 true。 | 
逻辑运算符:
| 操作符 | 描述 | 实例 | 
|---|---|---|
| and | 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。 | (A and B) 为 false。 | 
| or | 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。 | (A or B) 为 true。 | 
| not | 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 | 
其他:
| 操作符 | 描述 | 实例 | 
|---|---|---|
| .. | 连接两个字符串 | a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。 | 
| # | 一元运算符,返回字符串或表的长度。 | #"Hello" 返回 5 | 
字符串
string.byte (s [, i [, j]])
返回 s[i], … , s[j] 的数值,i 从 1 开始,j 默认为 i 。
string.char (···)
将 … 数值变为字符串。
示例:
str = "abc0"
print(string.byte(str, 2, 4)) // 98 99 48
print(string.char(98, 99, 48)) // bc0
string.len (s)
返回 s 的字节数。
string.lower (s)
字符串全部转为小写字母。
string.upper (s)
字符串全部转为大写字母。
string.reverse (s)
字符串反转。
string.sub (s, i [, j])
返回字串。 i 从 1 开始, j 默认为 -1 表示到最后一个字符。
string.rep (s, n)
将 s 复制 n 遍。
表
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存
table.concat (list [, sep [, i [, j]]])
将 list[i], … , list[j] 连接起来并以 sep 分隔。sep 默认为空串。i 默认为 1, j 默认为 #list 。
示例:
test = { "a", "b", "c" }
print(table.concat(test)) // abc
print(table.concat(test, " ")) // a b c
print(table.concat(test, " ", 2, 3)) // b c
table.insert (list, [pos,] value)
在 list 的 pos 插入 value , pos 默认为最后。
示例:
test = { "a", "b", "c" }
table.insert(test, "e")
print(table.concat(test)) // a b c e
table.insert(test, 4, "d")
print(table.concat(test)) // a b c d e
table.remove (list [, pos])
删除 pos 处的值, pos 默认为最后。
table.sort (list [, comp])
将 table 按 comp 排序。

                            
Comments NOTHING