如何使用Lua表

我正在从《Lua 程序设计》(第二版)开始学习 Lua,但书中以下内容我不太理解,讲解得非常模糊:

a.) w={x=0,y=0,label="console"}

b.) x={math.sin(0),math.sin(1),math.sin(2)}

c.) w[1]="another field"

d.) x.f=w

e.) print (w["x"])

f.) print (w[1])

g.) print x.f[1]

当我完成 a.) 后执行 print(w[1]),为什么它不打印出 x=0

c.) 的作用是什么?

e.) 和 print (w.x) 有什么区别?

b.) 和 g.) 的作用是什么?

原文链接 https://stackoverflow.com/questions/8129727

点赞
stackoverflow用户275115
stackoverflow用户275115

你必须意识到:

t = {3, 4, "eggplant"}

与此相同:

t = {}
t [1] = 3
t [2] = 4
t [3] = "eggplant"

以及这个:

t = {x = 0, y = 2}

与此相同:

t = {}
t ["x"] = 0
t ["y"] = 2

或者这个:

t = {}
t.x = 0
t.y = 2

在 Lua 中,表不仅仅是列表,它们是 关联数组

当你打印 w [1] 时,真正重要的是行 c.)。实际上,直到行 c.),w [1] 才没有定义。

e.) 和 print (w.x) 没有区别。

b.) 创建一个名为 x 的新表,该表与 w 不同。

d.) 将对 w 的引用 _放置在 x 中_。 (注意:实际上它没有复制 w,只是一个 引用。如果你曾经使用过指针,它类似。)

g.) 可以分成两部分。首先,我们得到 x.f ,这只是另一种引用 w 的方式,因为它在行 d.) 中。然后,我们查找该表的第一个元素,即 "another field",因为它在行 c.) 中。

2011-11-14 23:50:17
stackoverflow用户4074771
stackoverflow用户4074771
local w = {
    --[1] = "another field"; -- 将设置这个值
    --["1"] = nil;  -- 不保存到这个位置, 不同于其他某些语言
    x = 0;
    y = 0;
    label = "console";

}
local x = {
    math.sin(0);
    math.sin(1);
    math.sin(2);
}

w[1] = "another field" --
x.f  = w

print (w["x"])

-- 因为 x.f = w
-- x.f 和 w 指向同一个表地址
-- 所以 (x.f)[1]、w[1] 和 x.f[1] 的值相等
print (w[1])
print ((x.f)[1])
print (x.f[1])

-- print (x.f)[1] 不符合 Lua 语法
-- 只有一个参数并且类型是字符串的函数可以这样使用 print "xxxx"
-- 所以打印 x.f[1] 会导致错误

-- 在表中, 你可以使用任何 Lua 内部类型的值作为键
-- 就像这样

local t_key = {v=123}
local f_key = function () print("f123") end

local t = {}
t[t_key] = 1
t[f_key] = 2

-- 然后 t 的键就像使用 t_key/f_key 的句柄一样

-- 当你使用 t[{}] = 123 这样的语句时,
-- 值 123 相关联的是这个没有名字的表 {} 的句柄
2014-09-24 13:29:34
stackoverflow用户4632769
stackoverflow用户4632769

在行内表格声明中创建密钥的另一种方法如下:

x = {["1st key has spaces!"] = 1}

这种方法的优点是您可以使用具有空格和任何扩展 ASCII 字符的密钥。实际上,密钥可以是任何东西,甚至是实例化对象。

function Example()
    --例子函数
end
x = {[Example] = "A function."}

任何变量、值或数据都可以放入方括号中,作为键使用。同样的道理也适用于值。

实际上,这可以替代 python 中的 in 关键字的功能,因为您可以按值对表进行索引,以检查它们是否存在。

在未定义的表格部分获取值不会导致错误。它只会给您 nil。同样的道理也适用于使用未定义的变量。

2015-03-04 16:01:11