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. 

1 0
原创粉丝点击