zoukankan      html  css  js  c++  java
  • openresty开发系列15--lua基础语法4表table和运算符

    openresty开发系列15--lua基础语法4表table和运算符

    lua中的表table

    一)table (表)
    Table 类型实现了一种抽象的"关联数组"。即可用作数组,也可以用作map。
    lua中没有数组和map,都是用table这个类型

    --数组
    java   int[] intArr = new int[]{1,2,3,4,5,6};
    intArr[0]
    intArr[1]
    --map----> key value

    HashMap map
    map.add(key,value)

    -- 初始化表
    mytable = {}

    -- 指定值
    mytable[1]= "Lua"
    mytable[2]= "Lua2"
    mytalbe["k1"] = v1;

    -- 移除引用
    mytable = nil
    -- lua 垃圾回收会释放内存

    lua类似数组的table ,索引值从1开始,,而不是0
    mytable={1,2,3,4,5}
    mytalbe[1]

    mytable={"a","b","hello","world"}

    mytable1 = {key1 = "v1",k2="v2",k3="v3"}

    mytable2 = {"a",key1 = "v1","b",k2="v2",k3="v3","hello","world"}

    print(mytable[1],mytable[2],mytable[3],mytable[4]);
    print("------------------")
    print(mytable1["key1"],mytable1["k2"],mytable1["k3"]);
    print("------------------")
    print(mytable2[1],mytable2["key1"],mytable2[2],mytable2["k2"],mytable2[3],mytable2[4]);

    talbe   key可以为 number 或字符串,,也可以是其他类型

    table 是内存地址 赋值给变量

    二)table进行赋值给变量,其实是把内存地址给了变量,变量只是引用了内存地址

    local mytable1 = {"a",key1 = "v1","b",k2="v2",k3="v3","hello","world"}

    local mytable2 =  mytable1

    mytable2[1] = "aa"

    print(mytable2[1])

    print(mytable1[1])

    mytable2 = nil  --移除的是引用

    print("-------------")
    print(mytable1[1])

    内存指针--》C++

    lua算数运算符


    一)算术运算符

    +    加法    
    -    减法    
    *    乘法    
    /    除法    
    %    取余    
    ^    乘幂    
    -    负号

    print(1 + 2)       -->打印 3
    print(5 / 10)      -->打印 0.5。 这是Lua不同于c语言的
    print(5.0 / 10)    -->打印 0.5。 浮点数相除的结果是浮点数
    -- print(10 / 0)   -->注意除数不能为0,计算的结果会出错
    print(2 ^ 10)      -->打印 1024。 求2的10次方

    local num = 1357
    print(num % 2)       -->打印 1
    print((num % 2) == 1) -->打印 true。 判断num是否为奇数
    print((num % 5) == 0)  -->打印 false。判断num是否能被5整数


    二)关系运算符

    ==    等于,检测两个值是否相等,相等返回 true,否则返回 false    
    ~=    不等于,检测两个值是否相等,相等返回 false,否则返回 true    不想java !=,,~=
    >    大于,如果左边的值大于右边的值,返回 true,否则返回 false    
    <    小于,如果左边的值大于右边的值,返回 false,否则返回 true    
    >=    大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false    
    <=    小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false

    print(1 < 2)    -->打印 true
    print(1 == 2)   -->打印 false
    print(1 ~= 2)   -->打印 true
    local a, b = true, false
    print(a == b)  -->打印 false

    注意:table, userdate 和函数;判断的是引用地址的判断
    local a = { x = 1, y = 0}
    local b = { x = 1, y = 0}
    if a == b then
      print("a==b")
    else
      print("a~=b")
    end

    三)逻辑运算符
    and    逻辑与操作符。(A and B) 若 A 为 假,则返回 A,否则返回 B
    or    逻辑或操作符。(A or B) 若 A 为 真,则返回 A,否则返回 B
    not    逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。 永远只返回 true 或者 false

    local c = nil
    local d = 0
    local e = 100

    print(c and d)  -->打印 nil
    print(c and e)  -->打印 nil
    print(d and e)  -->打印 100

    print(c or d)   -->打印 0
    print(c or e)   -->打印 100
    print(d or e)   -->打印 0

    print(not c)    -->打印 true
    print(not d)    -->打印 false

    短路取值 原理
    and  与,,,if(a and b and c)

    a and b and c   a为真,b为真,c为真  返回c
                    a为真,b为假,c为真  返回b
                    a为假 bc不管bc为什么值  返回a

                    一路去判断变量值是否为真,一旦遇到某个变量为假,就立刻短路返回 返回值就是 假的变量值

    a or b or c     一路判断变量值是否为真,一但遇到某个变量为真,就立刻短路返回,返回值就是 真的变量值
                    a为真,bc    返回a

                    a为假,b为真,不管c是什么值 返回b



    四)其他运算符
    ..    连接两个字符串    a..b ,其中 a 为 "Hello " , b 为 "World", 输出结果为 "Hello World"。
    #    一元运算符,返回字符串或表的长度。 #"Hello" 返回 5


    很多字符串连接 我们如果采用..这个运算符 ,性能是很低


    推荐使用 table 和 table.concat() 来进行很多字符串的拼接


    五)优先级
    ^
    not   # -
    *   /   %
    +   -
    ..
    < > <=  >=  ==  ~=
    and
    or
    ------------------------
    local a, b = 1, 2
    local x, y = 3, 4
    local i = 10
    local res = 0
    res = a + i < b/2 + 1  -->等价于res =  (a + i) < ((b/2) + 1)
    res = 5 + x^2*8        -->等价于res =  5 + ((x^2) * 8)
    res = a < y and y <=x  -->等价于res =  (a < y) and (y <= x)

  • 相关阅读:
    The first appliaction for "Hello World!"
    zone
    learn to study
    深入理解 Angular 2 变化监测和 ngZone
    看看吧
    生命周期钩子
    一个简单的todo
    依赖注入
    @Output()
    @Input
  • 原文地址:https://www.cnblogs.com/reblue520/p/11429741.html
Copyright © 2011-2022 走看看