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

原创 2015年07月07日 10:43:33

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 函数名(参数)"的调用形式才算是一条“尾调用”,没有多余的操作。
       作用:因为“尾调用”不耗费栈空间,可以实现"尾调用消除";

Lua 基础之函数进阶

闭包 closure 函数可以嵌套函数,内层函数可以访问外层函数的局部变量,这种特性叫做和函数闭包 lua 中除了全局变量和局部变量之外,还有一种叫“非局部变量”的变量 闭包 closure 的概念是...
  • xingxinmanong
  • xingxinmanong
  • 2017年07月18日 09:59
  • 255

lua 的基本数据类型和函数应用 . :符号的区别

主要记录:从lua的基本数据类型等基础知识到工作中的运用所遇到一些问题,希望自己可以坚持下来,在2017年能做的更好。同时也巩固自己的技术水平。...
  • freshstraw
  • freshstraw
  • 2017年03月27日 17:00
  • 582

一个使用c++在lua中创建自定义数据类型的简易方法

luabind  一个使用c++在lua中创建自定义数据类型的简易方法 分类: 游戏编程2010-04-15 20:12 1774人阅读 评论(0) 收藏 举报 luac...
  • linuxheik
  • linuxheik
  • 2014年01月23日 13:25
  • 1141

js基础笔记{变量、数据类型、数据的操作}

一。javascript的作用。 二。javascript的历史。 三。javascript整体感知 1.代码的存放位置 放在head里面,如果没有style代码放在title...
  • bin1813
  • bin1813
  • 2016年04月18日 22:19
  • 217

JavaScript基础----03Javascript基础-变量和数据类型

html> lang="en"> charset="UTF-8"> 声明变量--> var i = 10; var j = ...
  • zhaihaohao1
  • zhaihaohao1
  • 2015年08月05日 20:30
  • 210

Java基础--基础数据类型及封装数据类型

引用数据类型(封装数据类型)--面向对象设计的数据类型---把成一类的方式存在,它们不能扩展,绝种的。没有子类。 整型:Byte Short Integer Long 浮点型:Float Double...
  • u013820054
  • u013820054
  • 2016年09月22日 16:50
  • 463

lua学习(3)______lua中的基本类型

这章我们来了解lua中变量的基本类型。 Lua中一共有8种基础类型: nil(空)、boolean(布尔)、number(数字)、string(字符串)、userdata(自定义类型)、funct...
  • y1196645376
  • y1196645376
  • 2016年09月01日 22:36
  • 1463

Lua虚拟机分析之一

1  核心的数据结构 2
  • u012083134
  • u012083134
  • 2014年05月25日 13:20
  • 2001

Lua 基础之数据类型

Lua 有 nil,boolean,number,string,table,function 和 userdata 七种数据类型。我们可以用 type() 函数来返回一个变量的类型,返回值是 stri...
  • xingxinmanong
  • xingxinmanong
  • 2017年07月16日 17:44
  • 173

lua之诡异的tonumber

昨晚翻看lua源码的时候,发现在luaO_str2num有特殊处理,确切来说是在l_str2int(字符串转换成整形),lstr2d(字符串转换成double类型)size_t luaO_str2nu...
  • qq_19079937
  • qq_19079937
  • 2016年07月14日 11:35
  • 2843
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lua—基础分析(数据类型和函数)
举报原因:
原因补充:

(最多只允许输入30个字)