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