《Lua程序设计》学习笔记
命令行执行
类型为table
的全局变量arg
保存命令行参数,脚本名为arg[0]
,真正的参数从arg[1]
开始,而脚本之前则是负数的下标
例如lua -e "sin=math.sin" script a b
的参数如下
arg[-3] = "lua" |
八种基本数据类型
nil
Boolean
number
string
userdata
function
thread
table
Lua
是一个动态类型语言,不用声明变量的类型,每个变量携带自己的类型
type(v)
获取v
的变量类型,返回的是字符串
type(a) --> nil |
逻辑运算符
and |
骚操作
表达式
x and y
,当x
为false
时值为x
,为true
时值为y
表达式x or y
,当x
为false
时值为y
,为true
时值为x
表达式x and y or z
,当x
为false
时值为z
,为true
时值为y
(y
不能为false
)
注意:在条件判断上,只有Boolean
的false
和nil
是假,其他任何值都是真,包括数字0
和空字符串""
Numbers
从Lua 5.3
开始,number
类型有两种存储方式,分别是64-bit integer
和双精度浮点型float
,之前只有双精度浮点型,在有限制的平台上可以把Lua 5.3
编译成Small Lua
,使用32-bit integer
和单精度浮点型float
type(num)
只能输出number
,如果要区分实际的类型,可以用math.type()
math.type(3) --> integer |
算术运算符
+ |
3.0 / 2.0 --> 1.5 |
取模骚操作,获取浮点数精确到几位的数
x = math.pi |
关系运算符
> |
math
库
math.pi --数字π |
num + 0.0
整型转浮点型
num | 0
浮点型转整型,不能有小数部分,且数值大小必须在范围内,否则会报错
浮点型能精确表示的整型范围[-2^51, 2^51]
Strings
Lua
的字符串也是不可变类型
字符串的定义用双引号和单引号都行
长字符串定义,里面的字符串不会被转义,两个[[
和]]
之间可以加任意数量的=
,避免a[b[i]]
这种混乱,可以为0个
s = [==[ |
#s
取字符串字节长度,注意是字节长度,在不同编码下可能跟字符长度不一样
a = "hello" |
s1 .. s2
拼接字符串,s1
是number
类型时,后面必须要跟一个空格,不然编译器会把第一个点当成数字的小数点,从而报错
"Hello " .. "World" --> Hello World |
字符串与数字的转换
任何算术操作,如果操作数是个字符串,会尝试把字符串转成数字
相反,任何字符串操作,如果操作数是数字,会尝试把数字转成字符串
注意:字符串转数字的结果都会转成浮点型float
"10" + 1 --> 11.0 |
显示地把字符串转换成数字
tonumber(s) --默认按10进制转换 |
显示地把数字转换成
tostring(num) |
string
库
string.len(s) --获取字符串长度,跟#str一样 |
Tips
所有字符串库方法,可以用s:fun()
这种格式来执行
s = "123" |
reverse,upper,lower,byte,char
这几个方法对utf-8
编码的字符串可能会失效
len,sub
取的是字节长度而不是字符长度
Tables
Lua
里主要的(实际上是唯一的)数据结构机制
本质上是一个联合数组,不过索引不止是数字,还可以是其他任何值,除了nil
(emmm,这不就是hash表吗)
a = {} --创建表 |
多种构造方式
a = {} --1.初始化一个空表,最基础的方式 |
Arrays, Lists, and Sequences
用表作为一个数组
-- read 10 lines, storing them in a table |
中间没有空洞,这样的数组可以称为Sequence
#a --> 10 获取数组的长度,不能对有空洞的数组获取长度,实际上是[1, n]的key所能到达的最大n的值 |
遍历表
用pairs
迭代器遍历,但是遍历顺序不确定,每次执行可能都是不同的顺序
t = {10, print, x = 12, k = "hi"} |
对于数组,可以用ipairs
迭代器,会保证顺序
t = {10, print, 12, "hi"} |
遍历数组的另一种方式
t = {10, print, 12, "hi"} |
安全访问
比起普通的if lib and lib.foo then...
,用a or {}
这种方式效率更高,能访问更少次数的表,虽然写法比较难看
zip = company and company.director and -- 访问了6次表 |
table
库
可以理解成List
或Sequence
的库..
table.insert(t, i, v) -- 在i的位置插入v,把后面的值往后移一位 |