LUA: 不理解 a.x 和 a[x] 的区别?

正如 Lua 手册所说,对该语言不熟悉的新手很容易陷入认为 a.x 和 a[x] 更相似而不是不同的陷阱中。我也是这些新手中的一个,哈哈。请问有人能解释一下为什么 a.x 会返回 nil,但是 a[x] 会返回 10,a.x 会返回 nil 吗?

a ={}

x = "y"

a[x] = 10

 print(a[x])  -- 对于 "y",返回 10

 print(a.x)  -- 对于 "x",返回 nil

 print(a.y)  -- 对于 "y",返回 10

说实话,我觉得我已经理解了上面代码的原理,但我真正想知道的是概念上的原因:

invitems = {}

name = string.lower(name)

invitems[name] = "weapon"

print(invitems[name])  ----> 返回 weapon

print(invitems.name)  ----> 返回 nil

print(invitems.string.lower(name))  ----> 返回 weapon

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

点赞
stackoverflow用户3574628
stackoverflow用户3574628

a[x]是更基础的索引构造。a.xa['x']的语法糖。因此,在a[x]中,x是变量名。在a.x中,x是一个字面字符串,与变量x无关。

2021-10-06 02:15:44
stackoverflow用户6879826
stackoverflow用户6879826

Lua中表访问的语法为<table>[<expression>]。当使用方括号符号即 a[x] 访问表时,表达式x首先被计算,然后x的值作为表索引。

另一方面,a.x是表访问a["x"]的简化语法。此处,字符串"x"被视为表索引。

考虑以下REPL中的交互:

> a = {}
> x = "y"
> a[x] = 10
> a.x
nil
> a[x]
10
> a["y"]
10
> a.y
10

通过a[x] = 10x首先评估为值"y",因此访问a["y"]的表,将其值存储在那里。但在此之前,表是空的。尝试访问a.x相当于a["x"],在键为"x"a中没有存储值,因此返回nil。但请注意,您也可以使用存储的值10来访问a["y"]或者等价的a.y

或考虑上述交互的继续操作:

> a[1] = 42
> z = 1
> a[z]
42
> a.z
nil
> a["z"]
nil
> a["z"] = "forty-two"
> a.z
forty-two
> a[z]
42

现在,a[1]将值42分配给键为1的表字段。给z赋值为1后,我们可以使用a[z]访问表中的新值,因为z等于1。但是我们无法使用a.z访问该值,因为没有与"z"键匹配的表字段。在a["z"] = "forty-two"之后,有一个钥匙为"z"的值,现在可以看出,a.za[z]是表a的完全不同成员。

2021-10-06 02:40:02