微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lua学习笔记

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\

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐