Lua程序设计(第2版)

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:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Lua)