ch1_开始
1)“程序块”:lua执行的每段代码,都被称为程序块。一个程序块就是指一连串的语句或命令。
2)Lua语法中,换行没有任何作用。lua代码不需要分隔符。
3)退出交互模式和解析器:window/dos 输入ctrl+z, 或者调用os.exit()。(在cmd中会退出lua解析器)
4)Lua的标示符:任意字母,数字,下画线构成,不能以数字开头。避免使用“_”开头的变量,这类“_”开头的是标示符做特殊用途,有大小写区分
5)全局变量不需要声明,直接变量名字=值,删除的时候置nil
6)解释器程序: #开头,解释器会忽略掉。 lua [选项参数] [脚本(参数)]
关于多行注释(注释内容有]])使用:
--[=[
1111111111111 ]]2222222222
]=]
ch2_类型与值
1)lua是动态类型的语言。 nil(空),boolean(布尔),number(数字),string(字符串),userdata(自定义类型),function(函数),thread(线程),table(表)
type(变量名) 返回类型名字
变量可以包含任何类型的值。
2)nil:区别其他任何值
boolean:lua将值false和nil都是为假
3)number:数字,用于表示实数,lua没有整数类型。
4)string(字符串):lua采用8位编码,可以具有任何数值编码包括数值0。 可以将任意二进制数据存储到一个字符串中,不能像 c语言里面修改字符串的某个字符。
lua字符串的转义序列: \a 响铃 \b 退格 \f提供表格 \n 换行 \r 回车 \t 水平 \v垂直 \\反斜杠 \"双引号 \' 单引号
lua在字符串操作时,会尝试将这个字符串转换为一个数字。
字符串连接符:".." ,".."前面必须加一个空格
#获取字符串的长度
5)table 表:没有固定的大小,可以用来表示模块(module),包(package),对象(object),类似Dictionary的结构,用key取value。table永远是匿名的,一个持有table的变量与table自身之间没有固定的关联性。数组以索引1开始。
a={} a["xy"]="c" print(a.xy) print(a["xy"])
6)function函数:函数作为”第一类值“来看,表示函数可以储存在变量中。
ch3_表达式
1)算数运算符:+ - * / ^ % 还有负号-
2)关系操作符:< > <= >= == ~= 返回结果true或者false ,nil只和自身相等。 table,userdata和函数,lua只做引用比较。
3)逻辑运算符:第一个操作数为假,则返回第一个操作数,否则返回第二个。 or,第一个操作数为真,返回第一个,否则返回第二个。
a and b or c 等价于: a?b:c
a = a or b 等价于:if not a then a = b end
not 只返回 true和false
4)字符串连接: .. 两个点
5)优先级:二元操作符中:指数操作符,连接操作符 是右结合的,其他都是左结合的。
6)table构造式(table constructor)
例如: tabletest = {[0] = "123", hello = "123456"} print(tabletest.hello)
ch4_语句
1)赋值:允许多重赋值 a,b = 10 , 2*x print('a:'..a .. ",b = " ..b)
2)局部变量:作用域仅限于声明他们的那个块,多用局部变量。
3)控制结构: if ,for,while以end作为结尾,repeat以until作为结尾。
lua 不支持switch语句
4)数字型for: for var = exp1, exp2, exp3 do end var从exp1变化exp2,每次变化都以exp3作为步长递增var。不指定exp3,则默认为1。
math.huge最大值
不能对循环变量做任何赋值
5)泛型for:迭代器: io.lines,table元素的(pairs),迭代数组元素的(ipairs),迭代字符串单词的(string.gmatch)
6)break与return:
ch5_函数:
函数参数:若实参多余形参,则舍弃多余的实参。若实参不足,则多余的形参初始化为nil。
1)多重返回值:允许函数返回多个结果
table.unpack() 输入一个table,从下表1开始返回数组的所有元素
f = string.find
a = {"hello", "ll"}
print(f(table.unpack(a)))
2)变长参数: ... 3个点代表该函数可接受不同数量的实参。
select 用于访问所有的变长参数
3)具名参数:参数参数有“位置性”
ch6_深入函数
函数是一种“第一类值”。
第一类值:Lua中的函数和其他传统类型的值一样,都可存储到变量中。
词法域:一个函数可以嵌套到零一个函数中,位于内部的函数可以访问外部函数的局部变量。
1)闭合函数(closure):一个函数加上该函数所需访问的所有“非局部的变量”。可以用来将函数临时存储。
这个用法很不错,学习一下。
2)非全局的函数:函数不仅可以存储在全局变量中,还可以存储在table的字段中和局部变量中。
3)正确的尾调用:尾调用---当一个函数调用时另一个函数的最后一个动作时,该调用才算是“尾调用”。eg: function f(x) return g(x) end
判断“尾调用消除”:务必要确定调用完一个函数之后,没有任何其他事情可以做了。
eg: return g(x) + 1 不是,还需要加法
return x or g(x) 不是,必须调整为一个返回值。
只有 return func(args) 这样的算是尾调用。
ch7_迭代器和泛型for
1)迭代器与closure: