《Lua程序设计》学习笔记
命令行执行
类型为table的全局变量arg保存命令行参数,脚本名为arg[0],真正的参数从arg[1]开始,而脚本之前则是负数的下标
例如lua -e "sin=math.sin" script a b的参数如下
arg[-3] = "lua" |
八种基本数据类型
nilBooleannumberstringuserdatafunctionthreadtable
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,把后面的值往后移一位 |


