XXX类型的语言
|--静态类型
| |--说明:编译期数据类型是固定的语言,它要求你在使用变量之前声明它的数据类型。Java/C
|--动态类型
| |--说明:执行期才去发现数据类型的语言。Python/VBScript
|--强类型
| |--举例:如果你有一个整数,它不进行显示转换,就不能将其视为一个字符串。Java/Python/C
|--弱类型
|--举例:与强类型对应,不需要进行显示转换。VBScript
--C++是强类型、静态类型语言。
--Lua是动态类型的语言。
nil
全局变量没有被赋值前默认值为nil;被赋nil表示删除该变量;经常被作为错误返回值
单行注释
--singleline comment
多行注释
--[[
multilinecomment.
--]]
8大类型
|--nilboolean number string userdata function thread table
type function
|--测试给定xxx的类型,xxx可以是类、变量或值等。
Boolean
|--控制结构中,除了false和nil为假外,其它值都为真。所以Lua认为0和空串都为真
String
|--Lua中字符串是只读的。
|--另外,[[...]]可以表示字符串,并且不会解释转义序列。
|--运行时,Lua会自动在string和number之间进行类型转换。
| |--print("10"+1) --> 11 --自动将字符串"10"转换为number 10,然后与1相加
| |--print(10 .. 20) -->1020 --“..”是字符串连接符
|--string和number间的转换:
|--tonumber("10")
|--tostring(10)
New concepts
|--第一类值
|--词法定界:被嵌套的函数可以访问它外部函数中的变量(类似
| 于Java中的内部类)
|--闭包:在有嵌套函数的情形下,当内部函数被外部函数作为返回值返回时,
内部函数对象的生命期超出了外部函数对象的生命期。
但是根据词法定界,内部函数能够使用外部函数的局部变量,
这与内部函数对象生命期长于外部函数对象生命期相矛盾。
为解决这个问题,闭包应运而生,它为内部函数对象所需要用到的外部函数
的局部变量做了备份。
|--外部函数的作用是创建内部函数,可以看成一个function factory
|--闭包指的是内部函数
Function
|--函数是第一类值(first-classvalue),意味着可以像使用变量一样得使用函数。
|--词法定界(lexicalscoping)
|--闭包
|--尾调用(不需要额外的栈来保存调用者的信息)
|--函数可以是匿名的:foo= function(x) return 2 * x end
| |--理解:函数名,实际上,是指向一个函数的变量
|
|--函数调用
| |--如果参数列表为空,必须用()表明是函数调用以免与变量混淆
| |--如果只有一个参数并且这个参数是字符串或者“表的构造”,则()是可选的
| | |--print("hellolua world!")
| |--形参实参的匹配:多余部分忽略,缺少部分用nil补足
|
|--可变参数:
| |--参数列表中用...表示
| |--Lua将可变参数放在一个arg表中,arg中还有一个表示参数数目的域n
|
|--参数命名:Lua的函数参数是和位置相关的
| |--技巧:将所有参数放在一个表中,并把表作为函数的唯一参数
|
|
unpack function
|--接受一个数组作为输入参数,返回数组中的所有元素
|--sample:
days= {"Sunday", "Monday", "Tuesday",
"Wednesday","Thursday", "Friday", "Saturday"}
print(days)--返回days的内存地址
print(unpack(days))--返回各个元素
and,or,not
|--and,or的返回值不是boolean类型的true和false,而是与两个操作数相关
|--a and b --判断第一个操作数,如果a为false,则返回a,否则返回b
|--a or b --判断第一个操作数,如果a为true,则返回a,否则返回b
|--x = x or v
|--
Assignment
|--Lua会先计算所有右边的值,然后再执行赋值操作
|--x,y = y, x --swap 'x' for 'y'
局部变量
|--应该尽量使用局部变量
| |--避免命名冲突
| |--访问局部变量的速度比访问全局变量更快
|--代码块,do ...end
Iterator
|--迭代工厂(创建闭包的工厂)
|--迭代函数(闭包)
|--范性for
| |--for <var-list> in<exp-list> do
| <body>
| end
| |--在自己内部保持迭代函数,实际上,主要保持了:迭代函数、状态常量和控制变量
| |--for循环一开始就初始化<exp-list>以获得迭代函数、状态常量和控制变量
| |--<var-list>的第一个变量为控制变量,其值为nil时循环结束
|
|--无状态的迭代器(避免自己创建闭包)
| |--ipairs:遍历数组中的每一个元素
|
编译、运行、调试
|--Lua会首先把代码预编译成中间码然后再执行
|--require\dofile\loadfile\loadstring\loadlib
|--chunk
|--错误
|--error\