在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
days = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} will initialize print(days[4]) --> Wednesday table从1开始,不是从0开始 Constructors do not need to use only constant expressions. We can use any kind of expression for the value of each element. For instance, we can build a short sine table as tab = {sin(1), sin(2), sin(3), sin(4), sin(5), sin(6), sin(7), sin(8)} To initialize a table to be used as a record, Lua offers the following syntax: table作为record使用 a = {x=0, y=0} which is equivalent to a = {}; a.x=0; a.y=0 No matter what constructor we use to create a table, we can always add and remove other fields of any type to it: 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(x.f[1]) --> another field w.x = nil -- remove field "x" Every time Lua evaluates a constructor, it creates and initializes a new table. Consequently, we can use tables to implement linked lists: 每次执行一个构造函数,lua创建和初始化一个新的table,因此,你可以使用table来实现linked list. list = nil
for line in io.lines() do
list = {next=list, value=line}
end
This code reads lines from the standard input and stores them in a linked list, in reverse order. Each node in the list is a table with two fields: l = list while l do print(l.value) l = l.next end (Because we implemented our list as a stack, the lines will be printed in reverse order.) Although instructive, we hardly use the above implementation in real Lua programs; lists are better implemented as arrays, as we will see in Chapter 11. We can mix record-style and list-style initializations in the same constructor: 我们可以混合记录性风格和列表形风格来初始化。 polyline = {color="blue", thickness=2, npoints=4, {x=0, y=0}, {x=-10, y=0}, {x=-10, y=1}, {x=0, y=1} } The above example also illustrates how we can nest constructors to represent more complex data structures. Each of the elements print(polyline[2].x) --> -10 Those two constructor forms have their limitations. For instance, you cannot initialize fields with negative indices, or with string indices that are not proper identifiers. For such needs, there is another, more general, format. In this format, we explicitly write the index to be initialized as an expression, between square brackets: 用[exp]表示索引 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]) --> --- That syntax is more cumbersome, but more flexible too: Both the list-style and the record-style forms are special cases of this more general one. The constructor 这个语法更笨重,但是比较灵活。list-style和record-style是这种一般化形式的特例。
{x=0, y=0} is equivalent to
{["x"]=0, ["y"]=0} and the constructor
{"red", "green", "blue"} is equivalent to
{[1]="red", [2]="green", [3]="blue"} For those that really want their arrays starting at 0, it is not difficult to write the following: 想要index从0开始,把第一个设置为0,这并不影响其他的,第二个默认为1,因为它是构造函数中的第一个list类型,其他的值跟随他。 days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"} Now, the first value, You can always put a comma after the last entry. These trailing commas are optional, but are always valid: a = {[1]="red", [2]="green", [3]="blue",} 同php一样,table后面放分号不影响正确性。 Such flexibility makes it easier to write programs that generate Lua tables, because they do not need to handle the last element as a special case。
Finally, you can always use a semicolon instead of a comma in a constructor. We usually reserve semicolons to delimit different sections in a constructor, for instance to separate its list part from its record part: {x=10, y=45; "one", "two", "three"} Tables as arraysFirst, remember that tables are still just key/value containers, Lua doesn't actually have an array type. But tables can be treated like arrays, which is explained here: Table constructors can contain a comma separated list of objects to create an "array":
This is a syntax shortcut for:
So it's still just a key/value association. You can also mix the array syntax with the usual key=value syntax:
求array length,
The > a={} 输出0. 请记住对于所有未初始化的元素的索引结果都是nil。Lua将nil作为定界数组结尾的标志。当一个数组有 print(table.maxn(a)) ->1000 There are two ways to add an item to the end of an array:
To loop over an array, use
To join together an array of strings, there's
For a list of all the table.* functions and their complete documentation, see [[3]]. Table values are referencesUnlike basic types such as numbers, when you store a table in a new variable, pass it to a function, etc., you don't create a new copy of the table. Instead you get a new reference (think of it like a handle, or pointer) to the same table: table值是引用.
Tables are freed from memory by the garbage collector sometime after the last reference to them is gone (not necessarily instantly). The garbage collector is designed to work correctly even in the case where a table (directly or indirectly) contains a reference to itself. A related thing to remember is that table comparison works by reference. Comparing tables using Finally, if you want to copy a table, you'll have to do it manually. Lua offers no standard function for it, mainly because of all the different ways you can copy a table.
Tables as unordered setsOften people new to Lua will create an array to store a group of objects, even if the order isn't necessary. The problem with this is that removal is slow (need to shift down other items), and checking if an item is in the array is slow (need to loop over all the items). This can be solved by storing items in the keys and setting values to a dummy value (like The main differences are that there's no easy way to get the count (you have to use a loop), and you can't store the same item twice in the set. So if you need to store a group of items, it's best to consider both sets and arrays to see what fits your situation best.
|
请发表评论