zoukankan      html  css  js  c++  java
  • Lua学习

    Lua 数据类型

    Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。

    数据类型描述
    nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
    boolean 包含两个值:false和true。
    number 表示双精度类型的实浮点数
    string 字符串由一对双引号或单引号来表示
    function 由 C 或 Lua 编写的函数
    userdata 表示任意存储在变量中的C数据结构
    thread 表示执行的独立线路,用于执行协同程序
    table Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

    可以使用type函数测试给定变量或者值的类型:

    print(type("Hello world"))      --> string
    print(type(10.4*3))             --> number
    print(type(print))              --> function
    print(type(type))               --> function

    nil(空)

    nil 类型表示一种没有任何有效值,它只有一个值 -- nil,例如打印一个没有赋值的变量,便会输出一个 nil 值

    > print(type(a))
    nil
    >

    boolean(布尔)

    boolean 类型只有两个可选值:true(真) 和 false(假),Lua 把 false 和 nil 看作是"假",其他的都为"真":

    number(数字)

    print(type(2))
    print(type(2.2))
    print(type(0.2))
    number
    number
    number

    string(字符串)

    字符串由一对双引号或单引号来表示。

    string1 = "this is string1"
    string2 = 'this is string2'

    也可以用 2 个方括号 "[[]]" 来表示"一块"字符串。

    html = [[
    <html>
    <head></head>
    <body>
        <a href="http://www.runoob.com/">菜鸟教程</a>
    </body>
    </html>
    ]]
    print(html)

    输出:

    <html>
    <head></head>
    <body>
        <a href="http://www.runoob.com/">菜鸟教程</a>
    </body>
    </html>

    字符串操作

    在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字:

    > print("2" + 6)
    8.0
    > print("2" + "6")
    8.0

    字符串连接使用的是 .. ,如:

    > print("a" .. 'b')
    ab
    > print(157 .. 428)
    157428
    >

    使用 # 来计算字符串的长度,放在字符串前面,如下实例:

    > len = "www.runoob.com"
    > print(#len)
    14
    > print(#"www.runoob.com")
    14
    >

    string.reverse(arg)
    字符串反转

    > string.reverse("Lua")
    auL

    table(表)

    在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表:

    -- 创建一个空的 table
    local tbl1 = {}
     
    -- 直接初始表
    local tbl2 = {"apple", "pear", "orange", "grape"}

    Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。

    不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始。

    local tbl = {"apple", "pear", "orange", "grape"}
    for key, val in pairs(tbl) do
        print("Key", key)
    end

    运行:

    Key    1
    Key    2
    Key    3
    Key    4

    function(函数)

    function factorial1(n)
        if n == 0 then
            return 1
        else
            return n * factorial1(n - 1)
        end
    end
    print(factorial1(5))
    factorial2 = factorial1
    print(factorial2(5))

    运行:

    120
    120

    Lua 变量

    Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

    局部变量的作用域为从声明位置开始到所在语句块结束。

    变量的默认值均为 nil。

    Lua 循环

    while循环

    while(condition)
    do
       statements
    end

    数值for循环

    var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 "执行体"。exp3 是可选的,如果不指定,默认为1。

    for var=exp1,exp2,exp3 do  
        <执行体>  
    end
    for i=10,1,-1 do
        print(i)
    end

    泛型for循环

    泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。

    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
        print(i, v)
    end

    i是数组索引值,v是对应索引的数组元素值。ipairs是Lua提供的一个迭代器函数,用来迭代数组。

    days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}  
    for i,v in ipairs(days) do 
    print(v)
    end
    输出:

      1--Sunday
      2--Monday
      3--Tuesday
      4--Wednesday
      5--Thursday
      6--Friday
      7--Saturday

    Lua repeat...until 循环

    repeat
       statements
    until( condition )
    repeat
       print("a的值为:", a)
       a = a + 1
    until( a > 15 )

    Lua 循环嵌套

    j =2
    for i=2,10 do
       for j=2,(i/j) , 2 do
          if(not(i%j)) 
          then
             break 
          end
          if(j > (i/j))then
             print("i 的值为:",i)
          end
       end
    end

    Lua 流程控制

       Lua if 语句

    if(布尔表达式)
    then
       --[ 在布尔表达式为 true 时执行的语句 --]
    end

       if...else 语句

    if(布尔表达式)
    then
       --[ 布尔表达式为 true 时执行该语句块 --]
    else
       --[ 布尔表达式为 false 时执行该语句块 --]
    end

    Lua 函数

       函数定义

    optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
        function_body
        return result_params_comma_separated
    end
    • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local

    • function_name: 指定函数名称。

    • argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

    • function_body: 函数体,函数中需要执行的代码语句块。

    • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开

       Lua 中我们可以将函数作为参数传递给函数

    myprint = function(param)
       print("这是打印函数 -   ##",param,"##")
    end
    
    function add(num1,num2,functionPrint)
       result = num1 + num2
       -- 调用传递的函数参数
       functionPrint(result)
    end
    myprint(10)
    -- myprint 函数作为参数传递
    add(2,5,myprint)

    运行:
    这是打印函数 -   ##    10    ##
    这是打印函数 -   ##    7    ##

       Lua函数可以返回多个结果值

    > s, e = string.find("www.runoob.com", "runoob") 
    > print(s, e)
    5    10

       Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...} 表示一个由所有变长参数构成的数组  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))  --->25

    Lua逻辑运算符

    操作符描述实例
    and 逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。 (A and B) 为 false。
    or 逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。 (A or B) 为 true。
    not 逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 not(A and B) 为 true。
    if ( a and b )
    then
       print("a and b - 条件为 true" )
    end

    Lua 数组

    数组,就是相同数据类型的元素按一定顺序排列的集合,可以是一维数组和多维数组。

    Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。

    一维数组

    array = {"Lua", "Tutorial"}
    
    for i= 0, 2 do
       print(array[i])
    end

    运行:
    nil
    Lua
    Tutorial

    多维数组

    Lua table(表)

    table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

    -- 初始化表
    mytable = {}
    
    -- 指定值
    mytable[1]= "Lua"
    
    -- 移除引用
    mytable = nil
    -- lua 垃圾回收会释放内存

    当我们为 table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。如果 a 设置为 nil ,则 b 同样能访问 table 的元素。如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。

    Table 操作

    序号方法 & 用途
    1 table.concat (table [, sep [, start [, end]]]):

    concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。

    2 table.insert (table, [pos,] value):

    在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

    3 table.maxn (table)

    指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)

    4 table.remove (table [, pos])

    返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

    5 table.sort (table [, comp])

    对给定的table进行升序排序。

    Lua 模块与包

    Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua,文件代码格式如下:

    -- 文件名为 module.lua
    -- 定义一个名为 module 的模块
    module = {}
     
    -- 定义一个常量
    module.constant = "这是一个常量"
     
    -- 定义一个函数
    function module.func1()
        io.write("这是一个公有函数!
    ")
    end
     
    local function func2()
        print("这是一个私有函数!")
    end
     
    function module.func3()
        func2()
    end
     
    return module

    require 函数

    Lua提供了一个名为require的函数用来加载模块。要加载一个模块,只需要简单地调用就可以了。

    语法: require "<模块名>"
    require("module")
     
    print(module.constant)
     
    module.func3()

    运行:
    这是一个常量
    这是一个私有函数!

    Lua 元表(Metatable)

    元表,允许我们改变table的行为,每个行为关联了对应的元方法。对两个table进行操作。

    例如,使用元表我们可以定义Lua如何计算两个table的相加操作a+b。

    有两个很重要的函数来处理元表:

    • setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
    • getmetatable(table): 返回对象的元表(metatable)。

    __index 元方法

    __index为键时:

    > other = { foo = 3 } 
    > t = setmetatable({}, { __index = other }) 
    > t.foo
    3

    __index为函数时:Lua就会调用那个函数,table和键会作为参数传递给函数。

    mytable = setmetatable({key1 = "value1"}, {
      __index = function(mytable, key)
        if key == "key2" then
          return "metatablevalue"
        else
          return nil
        end
      end
    })
    
    print(mytable.key1,mytable.key2)

       运行:

    value1    metatablevalue

       可以简写为:

    mytable = setmetatable({key1 = "value1"}, { __index = { key2 = "metatablevalue" } })
    print(mytable.key1,mytable.key2)

    __newindex 元方法

    __newindex 元方法用来对表更新,__index则用来对表访问 。

    为表添加操作符

    模式描述
    __add 对应的运算符 '+'.
    __sub 对应的运算符 '-'.
    __mul 对应的运算符 '*'.
    __div 对应的运算符 '/'.
    __mod 对应的运算符 '%'.
    __unm 对应的运算符 '-'.
    __concat 对应的运算符 '..'.
    __eq 对应的运算符 '=='.
    __lt 对应的运算符 '<'.
    __le 对应的运算符 '<='.

    __call 元方法

    __call 元方法在 Lua 调用一个值时调用。

    __tostring 元方法

    __tostring 元方法用于修改表的输出行为。

    Lua 协同程序(coroutine)

    Lua 错误处理

     xpcell(f , err)

    其中 f 参数是要调用的函数,err是捕获到错误的时候调用的函数。返回值status是错误状态,msg是错误消息。

    local  status , msg = xpcall ( main , __G__TRACKBACK__ )是程序的入口。

    Lua 面向对象

    LUA中最基本的结构是table,所以需要用table来描述对象的属性。

      --声明GaneScenc类

     local  GameScene  =  class (" GameScene " , function()

      return  cc.Scene : create() 

     end )

    --class( " GameScene " , function(){ ... } )函数是由Cocos2d-x Lua 引擎提供的,可以通过 Lua创建对象

    语法:class (classname , super )

    classname 是参数名,是字符串类型,super是调用父类构造函数。

    Lua 数据库访问

  • 相关阅读:
    ITU 测试向量 下载地址
    转:数字集群移动通信系统技术体制综述及优选准则
    转:留一手教你在美国亚马逊网购
    离散度的测量(来自百度百科)与应用(自己理解)
    G.718的mos分
    【转】关于Alchemy
    Ogg Squish 0.98 源代码
    转:分布式视频编码关键技术及其发展趋势
    分布式视频编码概述与应用(来自百度百科)和WynerZiv Coding算法
    @PostConstruct和@PreDestroy注解在spring源码中生效的流程
  • 原文地址:https://www.cnblogs.com/eggtomcato/p/10399719.html
Copyright © 2011-2022 走看看