zoukankan      html  css  js  c++  java
  • Lua中的table构造式(table constructor)

    最简单的构造式就是一个空构造式{},用于创建一个空table。

    构造式还可以用于初始化数组。例如,以下语句:
    days = {"Sunday", "Monday", "Tuesday", "Wednesday",
            "Thursday", "Friday", "Saturday"}
    会将days[1]初始化为字符串“Sunday”、days[2]初始化为"Monday",以此类推。

    Lua还提供了一种特殊的语法用于初始化记录风格的table:
    a = {x=10, y=20}
    以上这行代码等价于这些语句:
    a = {}; a.x=10; a.y=20

    无论使用哪种方式来创建table,都可以在table创建之后添加或删除其中的某些字段。

    【使用table编写链表】
    我们可以使用这样的方式使用table编写一个链表代码:每当Lua评估一个构造式时,都会先创建一个新table,然后初始化它。如下:
    list = nil
    for line in io.lines() do
        list = {next=list, value=line}
    end
    这段代码从标准输入中读取每行的内容,然后将每行按相反的次序存储到一个链表中。链表的每个节点都是一个table,table中含有两个字段:value(每行的内容)和next(指向下一个结点的引用)。以下代码便利了改练表,并打印了其内容:
    local l = list
    while l do
        print(l.value)
        l = l.next
    end

    可以将记录风格的初始化与列表风格的初始化混合在一个构造式中使用:
    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
    print(polyline[4].y)    --> 1

    这两种风格(列表风格和记录风格)的构造式各有其限制。例如,不能使用负数的索引,也不能用运算符作为记录的字段名。为了满足这些要求,Lua还提供了一种更通用的格式。这种格式允许在方括号之间,显式地用一个表达式来初始化索引值:
    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])        --> ---
    这种语法看似烦琐了一点,但却非常灵活。无论是列表风格的初始化,还是记录风格的初始化,其实都是这种通用语法特例。构造式{x=0,y=0}等价于{["x"]=0,["y"]=0},构造式{"r","g","b"}等价于{[1]="r",[2]="g",[3]="b"}。
    对于某些特殊情况如果真的需要以0作为一个数组的起始索引的话,通过这种语法也可以轻松做到:
    days = {[0]="Sunday","Monday","Tuesday","Wednesday",
            "Thursday","Friday","Saturday"}

    在一个构造式中还可以用分号(;)替代逗号(,)。

  • 相关阅读:
    Insertion Sort Gym
    Codeforces Round #524 (Div. 2) C. Masha and two friends 思路
    PTA 数据结构——是否完全二叉搜索树
    Crane UVA
    Unidirectional TSP UVA
    排序二叉树的建立,查询与删除
    The Tower of Babylon UVA
    DAG上的动态规划——嵌套矩阵问题
    Paper Folding UVA
    多图片上传插件
  • 原文地址:https://www.cnblogs.com/moonlightpoet/p/5681505.html
Copyright © 2011-2022 走看看