LuaNote
来源:互联网 发布:pubwin2015数据库账号 编辑:程序博客网 时间:2024/06/03 05:40
Lua学习笔记
1. lua是一种动态类型语言,有8种基本数据类型:nil,boollean,number,string,userdata,function,thread,table.
2. arg是lua脚本运行时的传入参数,是table类型,其中arg[0]是lua脚本全路径文件名。
3. 变量未初始化时,其类型为nil类型;将一个变量赋值为nil,就是将其删除。
4. lua中的条件测试与C/C++不同,在lua中,条件表达式的值可以是任何类型,但只有false和nil为假,其余全为真(0为真)。
5. number类型代表双精度浮点类型。
6. string中存储的是常量字符序列,不能单独修改其中的字符;可以用#获取字符串长度,eg:#str.
7. lua支持C语言转义字符。
8. 三种字符串字面值表示法:双引号("hello")、单引号('hello')、双中括号([[hello]]),前两种用于单行表示,后一种用于多行表示。
9. 字符串中如果有\z,字符串会忽略\z后的空字符,直到第一个非空字符,可用于将双引号或单引号表示的多行字符串连接成单行字符串。
10. lua中number类型和string类型可以自动相互转换,需要number的可以用string代替,需要string的可以用number代替。
11. lua中 .. 用于串接字符串,当第一个操作数是number类型时,number后要留有空格。
12. tonumber()与tostring用于number与string的相互转换。
13. table是匿名的,lua通过类似指针或引用来操作的;当不再有指针指向匿名table对象时,匿名table对象占用内存将被回收。
a = {}
a["first"] = 10
a["second"] = 20
b = a -- a,b代表同一个匿名table对象
a = nil -- a不再代表匿名table对象,b仍代表匿名table对象
b = nil -- b不在代表匿名table对象,匿名table对象所占内存被释放
14. table可以通过“.”索引key为string的value.
15. tb = {1,2,3,4,5} --tb[0] = nil, tb[1] = 1, 即table索引默认从1开始,而非0,与C/C++数组不同。
16. 关系运算的结果为boolean(true,false),在做==、~=关系运算时,若两个操作数为不同类型,则==返回假,~=返回真。
17. 若a = {1,2,3},b = {1,2,3},c=a,则a ~= b,a == c,因为a、b指向不同的table对象,a、c指向同一个table对象。
18. 关系运算中,若两个操作数类型不同,则只允许做==和~=运算。
19. 逻辑运算符(and,or,not)。
20. and运算,若第一个操作数为假,则返回第一个操作数;若第一个操作数为真,则返回第二个操作数。
21. or运算,若第一个操作数为假,则返回第二个操作数;若第一个操作数为真,则返回第一个操作数。
22. not运算,若操作数为假,则返回true;若操作数为真,则返回false。
23. string是不可变的,当串接两个string时,总是创建一个新的string.
24. x,y = y,x -- 交换两个值,多值赋值比等效的单值赋值要慢,因为多值赋值在赋值前要提取右侧的值。
25. local变量的作用域为[声明下一行开始,声明所在代码块结束],代码块:chunk, function, if、for等控制结构。
26. local a = a -- 左边的a为新定义的局部变量,其作用范围不包含声明行;右边的a为该行之前,改行所在代码块之外定义的变量。
27. 控制结构中,end用于终结if,for,while;until用于终结repeat。
28. if then else 控制结构
if 2 > 3 then
print("2 > 3")
elseif 3 > 4 then -- 不需要用end终止
print("3 > 4")
else
print("2 <= 3")
end
29. while控制结构(最少执行零次)
local n = 30
while n ~= 0 do
print(n)
n = n-1
end
30. repeat控制结构(最少执行一次)
repeat
local line-- line为repeat控制代码块内的局部变量,但其作用与包含until条件测试(特例)
line = io.read()
print("print: "..line)
until line ~= ""
31. numeric for控制结构
-- var为for控制机构内的局部变量,正常情况下不要手动修改其值(提前退出时用break)
-- exp1,exp2,exp3为表达式,循环开始前需要提前执行一次,整个循环过程中只执行一次,exp1为起点,exp2为终点,exp3为步长
for var = exp1,exp2,exp3 do
<something>
end
32. generic for控制结构
local days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
for k,v in pairs(days) do -- k,v均是局部变量
print(k,v)
end
33. break用于跳出for,repeat,while循环。
34. 可以通过do end自构代码块。
35. return用于函数中,只能出现在构成函数的代码块的最后,否则会有语法错误;若想使函数提前退出,可以通过do end自构代码块,让return处于其中,把该代码块置于函数中任意位置;return可以不带返回值,也可以有多个返回值。
36. goto不能跳进另一个代码块(因为label只在其所处代码块内可见);goto不能跳进局部变量的可见范围(因为可能会跳过变量声明);label要符合语法(::label_name::)。
37. 如果函数只有一个参数,且这个参数是字符串字面值或表构造器,那么调用这个函数时可以不加括号。
38. 函数调用时,其传入参数数量会自动调整匹配函数定义时的参数数量(与多值赋值相同,多则舍弃,少则补nil),该特性可以用于设置函数默认参数。
count = 0
function incCount(n)
n = n or 1-- n的值默认是1
count = count + n
return count
end
39. 对于多返回值函数,若函数作为表达式的一部分且不在最后,则只有第一个返回值参与表达式计算;若函数作为表达式的一部分且在最后,则所有返回值都可能参与表达式计算;若函数作为函数参数且不是最后一个参数,则只有第一个返回值作为函数参数;若函数作为函数参数且是最后一个参数,则所有返回值都可能作为函数参数;函数用于表构造器和函数作为函数参数规则一样;若将函数置于括号中,则括号表达式的值为函数的第一个返回值。
40. lua函数支持可变参数(参数数目可变),例如f(...)。
41. 函数是匿名的,程序中使用函数时其实是在使用代表一个匿名函数对象的变量。
print = function(a) return math.sin(a) end -- print原本是一个代表具有输出功能匿名函数对象的变量,现在是一个代表具有计算正弦功能匿名函数对象的变量
42. 闭包是由一个函数和该函数会访问到的非局部变量(或称upvalue)组成的,其中非局部变量指的是不是在局部作用范围内定义的变量,同时也不是全局变量,闭包主要应用在嵌套函数和匿名函数里;若一个闭包没有会访问的非局部变量,那么他就是一个普通的函数,因此函数是闭包的一种特例。闭包可以用来重新定义现有函数;闭包也可以用于创建沙盒;闭包也可以用来创建迭代器。
43. 利用闭包原理创建迭代器。
-- 利用闭包原理生成迭代器,其中外层函数为迭代器工厂,里面的闭包为迭代器
function values(t)
local i = 0
return function() i = i + 1; return t[i] end
end
local days = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}
for v in values(days) do
print(v)
end
44. #table时负索引和零索引不参与计算。
array_1 = {}
array_1[-2] = 1
array_1[-1] = 2
array_1[0] = 3
array_1[1] = 4
array_1[2] = 5
array_1[3] = 6
print(#array_1) --> 3
45.
- LuaNote
- perl HTML::TreeBuilder::XPath
- [从头学数学] 第106节 整理与复习--数学思考
- ASP.NET MVC5 网站开发实践
- 关于Method override for the designated initializer of the superclass '-init' not found警告
- leetcode笔记--Length of Last Word
- LuaNote
- jQuery.form.js使用
- 如何攒一个大的成功
- T044 - Drive Tape Alert 19 - Nearing Media Life
- uvaoj-1594:ducci sequence
- C/C++——基本数据类型的大小并且sizeof(int *) = 8
- Java org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class
- 利用asp.net绘制图形语言是vb.net
- 微信从无到有