关闭

Lua—基础分析(数据类型和函数)

299人阅读 评论(0) 收藏 举报
分类:

ps:小编是一名cocos2d学习者(不能说是开发者,毕竟小编还是处于学习过程),前段时间小编是学习的cocos2d-x的,但是由于市面上大部分公司采用了lua的开发模式,因此小编不得不往cocos2d-lua方向转。由于小编是初学者,因此记录的只是我学习过程中的遇到的问题。

table 表:  

   table是lua中最重要的一种数据类型(准确的不应该称为类型,用集合更加形象的说明,或者是一个关联数组)。
  关联数组:就是采用索引index-value模式,将索引(除nil的任何类型,因此table可是采用嵌套)和对应的值相关联。
   创建:  a = {} / a={1="first", 2 = "second", "a" = 3}; tabel是一种动态分配的对象,程序仅持有一个对它的引用或指针,因此创建的时候不会生成table的副本或创建新的table,因此不需要对其进行声明。
   表示:    操作table中元素的方法有a["x"]和a.x两种方法;区别:a["x"]表示采用字符串“x”来索引table;a.x表示采用变量x来索引table  

a={}  
k="X"
a[k]=10;
a[20]="great"
print(a[k])     --10
print(a["X"])  -- 10
k=20;
print(a[k])     --greate
a["X"]=a["X"]+1;  -- 21
print(a["X"])
print(a.X)  --a.X表示的是以字符串“X”索引table,  a[k]是表示用变量k的值来索引table
print(a.k)  --因为字符串“K”是未定义的值,因此是输出的nil
#:  返回一个线性数组或table中的最后一个元素的索引值,可以理解为获取的是其的长度:  print(a[#a])打印a中的最后一个元素的值 

操作符

   算术操作符:左值=右值(左值:用于表示变量在内存存储中的地址; 右值:表示该地址内存中的存储的值) 。

   关系操作符:关系操作符返回的结果都是true或false; 在处理table、函数、userdata,lua采用的是引用的比较方式(即:只有当它们引用同一个对象时,才认为相等)。     

   逻辑操作符:and、or或not 。

        and:第一个操作数为false,则返回第一个操作数;否则返回第二个操作数;         

        or:  第一个操作数为true,则返回第一个操作数;否则返回第二个操作数;      

    注释:从上面and和or的判断条件都是按照第一个操作数,因此我们称这种为“短路求值”,表示只有需要时才会去评估第二个操作数。 例如:“x=x or v” 表示: if not x then x = v end

函数:

     1.Lua中的函数属于第一类值(可以理解为是一种特殊的变量);   函数实际上是在讨论一个持有该函数的变量;   

     2.匿名函数:可以将function(x)   --body  end 视为一种函数的构造表达式(如table的构造是{}一样),然后将函数的构造式的结果称为“匿名函数”。                         

                           function derivative(f, delta)
                                delta = delta or 1e-4
                                return function (x)   --function(x)是匿名函数
                                      return (f(x + delta) - f(x))/delta
                                end
                            end

                            c = derivative(math.sin)  --derivative是高阶函数(将函数作为其实参的传入值)
                            print(c(10))

     3.闭合函数(closure):在运行时,每当Lua执行一个形如function...end 这样的表达式时,它就会创建一个新的数据对象,其中包含了相应函数原型的引用、环境    (environment,用来查找全局变量的表)的引用 以及一个由所有upvalue引用组成的数组,而这个数据对象就称为闭包。由此可见,函数是编译期概念,是静态的,而闭包是运行期概念,是动态的。
       非局部变量:表示一个变量既能被匿名函数访问到,又能被外层函数访问到。通俗的讲,closure就是一个函数加上该函数所需访问的所有“非局部变量”。
                    function newCounter()
                          local i = 0   --i 是非局部变量
                        return function ()  --返回closure
                          i = i+1
                               return i
                        end
                    end
         参见博客可以帮助理解:http://blog.csdn.net/lidatou/article/details/3866399
  4.非全局的函数          
local fact = function(n)
    if n==1 then 
       return 1
    else 
       return fact(n-1)   --error:调用fact(n-1)时,局部的fact(n-1)尚未定义完毕,因此这里调用的是一个全局的fact(因此会报fact为nil的错误)
end
                    
解决:
local fact 
    fact = function(n)        --这种其实是局部函数local function fact(n) 展开的‘语法糖’;特别注意在间接调用(如间接递归)的时候,要使用前置声明
       if n==1 then 
          return 1
       else 
          return fact(n-1)  --此时调用的fact是局部变量,虽然在函数定义时,这个局部变量的值尚未完成定义,但在函数执行后,fact肯定有了正确的值                       
end
   5.尾调用
       含义:函数在执行“尾调用”之后,程序也不需要保存任何有关于函数的栈的信息,跟goto语句类似。主要是为了改变当前的状态。
       表现形式:Lua中只有 "return <func>(<args>)"也就是只有"return 函数名(参数)"的调用形式才算是一条“尾调用”,没有多余的操作。
       作用:因为“尾调用”不耗费栈空间,可以实现"尾调用消除";

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12629次
    • 积分:339
    • 等级:
    • 排名:千里之外
    • 原创:18篇
    • 转载:18篇
    • 译文:0篇
    • 评论:0条
    最新评论