表达式

  Lua中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。还可以使非传统的函数定义和表构造。

 

算术运算符

  算术运算符用来组织整型和浮点型数据的算术运算。

    二元运算符:+-*/^%   (加减乘除幂取余)

    一元运算符:-      (负值)

  这些运算符的操作数都是实数。

 

    print(10.6%7)        -->   3.6

 

关系运算符

    <            >            <=          >=          ==          ~=

  关系运算是比较两个表达式大小关系的运算。这些操作符返回结果为false或者true;==和~=比较两个值,如果两个值类型不同,Lua认为两者不同;nil只和自己相等。Lua通过引用比较table、userdata、function。也就是说当且仅当两者表示同一个对象时相等。

 

    a = {};    a.x = 1;   a.y = 0

    b = {};    a.x = 1;   a.y = 0

    c = a

    a == c but a ~= b

 

  Lua比较数字按传统的数字大小进行,比较字符串按字母的顺序进行,但是字母顺序依赖于本地环境。

 

  当比较不同类型的值的时候要特别注意:

    “0”  == 0       -- false

    2 < 15            -- true

    “2”  < “15”     -- false    (alphabetical   order)

 

  为了避免不一致的结果,混合比较数字和字符串,Lua会报错,比如:2   <  “15”

 

逻辑运算符

  逻辑运算符是对布尔型变量进行运算,其结果也是布尔型。

    and         or           not

  逻辑运算符认为false和nil是假(false),其他为真,0也是true。

  and和or的运算结果不是true和false,而是和它的两个操作数相关。

    a      and  b     --     如果a为false,则返回a,否则返回b

    a      or    b     --     如果a为true,则返回a,否则返回b

    print(4 and 5) -->   5

    print(nil and 13)     --> nil

    print(false and 13)  --> false

    print(4 or 5)          --> 4

    print(false or 5)      --> 5

  一个很实用的技巧:如果x为false或者nil则给x赋初始值v

    x = x or v

  等价于

    if not x then

      x = v

    end

  and 的优先级比or高。

 

  C语言中的三元运算符        a ? b : c   在Lua中可以这样实现:(a and  b) or c

  not 的结果一直返回false或者true

    print(not nil)   --> true

    print(not false)       --> true

    print(not 0)     --> false

    print(not not nil)    --> false

 

连接运算符

  ..            -- 两个点

  字符串连接,如果操作符为数字,Lua将数字转成字符串。

    print(“Hello” .. “World”)      -->   Hello World

    print(0 .. 1)    --> 01

 

优先级

  从高到低的顺序:

    ^

    not          -

    *            /

    +            -

    ..

    <            >            <=          >=          ~=          ==

    and

    or

 

  除了^和..外所有的二元运算符都是左连接的。

    x^y^z             <-->               x^(y^z)

 

表的构造

  构造器是创建和初始化表的表达式。表示Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:

    days = {“Sunday”,”Monday”,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”}

    Lua将"Sunday"初始化days[1](第一个元素索引为1)

  构造函数可以使用任何表达式初始化:

    tab = {sin(1),sin(2),sin(3),sin(4),sin(5),sin(6),sin(7)}

 

  如果想初始化一个表作为record使用可以这样:

    a = {x = 0, y = 0}         <-->        a = {} ; a.x = 0; a.y = 0

 

  不管用何种方式创建table,都可以向表中添加或者删除任何类型的域,构造函数仅仅影响表的初始化。

    w = {x = 0 , y = 0 , label = “console”}

    x = {sin(0),sin(1),sin(2),}

    w[1] = “another field”

    x.f = w

    print(w[“x”])         -->   0

    print(w[1])            -->   another field

    print(w.f[1])          -->   another field

    w.x = nil               -->   remove field “x”

 

  每次调用构造函数,Lua都会创建一个新的table,可以使用table构造一个list:

    list = nil

    for line in io.lines() do

      list = {next = list,value = line}

    end

  下面的代码打印链表的内容:

    l = list

    while l do

      print(l.value)

      l = l.next

    end

 

  在同一个构造函数中可以混合列表风格和record风格进行初始化,如:

    polyline = {color = “blue”, thickness = 2,npoints = 4,

      {x = 0 ,y = 0},

      {x = -10 ,y = 0},

      {x = -10 ,y = 1},

      {x = 0 ,y = 1},

    }

  这个例子也表明可以嵌套构造函数来表示复杂的数据结构。

    print(polyline[2].x)              --> -10

 

  上面两种构造函数的初始化方式还有限制,比如不能使用负索引初始化一个表中元素,字符串索引也不能被恰当的表示。下面介绍一种更一般的初始化方式,用[expression]显示的表示将被初始化的索引:

    opnames = {[“+”] = “add”,[“-”] = “sub”, [“*”] = “mul”,[“/”] = “div”}

    i = 20 ; s = “-”

    a = {[i + 0] = s , [i + 1] = s .. s , [i + 2] = s .. s .. s, }

    print(opnames[s])   --> sub

    print(a[22])    --> ---

 

  list风格初始化和record风格初始化是这种一般初始化的特例:

    {x = 0 ,y = 0}        <-->        {[“x”] = 0,[“y”] = 0}

    {“red”,”green”,”blue”}         <-->        {[1] = “red”,[2] = ”green”,[3] = ”blue”}     

 

  如果真的想要数组下标从0开始:

    days =

       {[0] = “Sunday”,”Monday”,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday”}

  注意:不推荐数组下标从0开始,否则很多标准库不能使用。

 

  在构造函数的最后的","是可选的,可以方便以后的扩展。

    {[1] = “red”,[2] = ”green”,[3] = ”blue”,}

  在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。

    {x = 10,y = 45;”one”,”two”,”three”}

posted @ 2015-10-15 14:33  _Soy  阅读(279)  评论(0编辑  收藏  举报