Lua:使用参数引用表的值时遇到的问题

在使用参数时,我缺失了某些基本的东西。

obj = {
    name = "hey"
}
function say_name(p,k)
    return p.k
end

print(say_name(obj,name))  --没有输出 "hey"

我不明白为什么这个函数不会输出与 print(obj.name) 相同的结果,即 "hey"。

更改这个函数会得到以下结果:

function say_name(p) --有效……这对我来说是有意义的
    return p.name
end
function say_name(p,k) --无效……为什么 k 不像 p 一样起作用?
    return p.k
end
function say_name(p,name) --有效……但为什么呢?难道 name 不像 k 一样是一个参数吗?
    return p.name
end

是因为我正在使用参数引用表的值吗?我是否缺少某些规则?

点赞
用户2858170
用户2858170

尝试这样做:

obj = {
    name = "hey"
}
function say_name(p,k)
    return p[k]
end

print(say_name(obj,"name"))

我在 name 周围添加了引号。namenil,但你需要字符串 "name" 来索引 obj.nameobj["name"]

p.k 等效于 p["k"]!这仅适用于 Lua 名称有效的字符串键。如果你有一个变量或任何其他键,则需要使用方括号表示法。

来自Lua 5.4 参考手册-3.2 Variables

方括号用于索引表:

 var ::= prefixexp ‘[’ exp ‘]’

通过元表(参见§2.4),可以更改对表字段的访问的含义。

语法 var.Name 只是 var["Name"] 的语法糖:

 var ::= prefixexp ‘.’ Name

function say_name(p,k) --不行...为什么k和p不同?
    return p.k
end

p.kp["k"]。它与你函数的参数 k 没关系。

function say_name(p,name) --可用....为什么?name不像k一样是参数吗?
    return p.name
end

p.namep["name"]。它与你的参数 name 没关系。它只是一个巧合,对于 obj.name 运行,因为 obj 有一个字段 "name",其他任何字符串都不起作用。

2021-04-06 07:12:17