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

Posted

技术标签:

【中文标题】Lua:使用参数引用表值时的问题【英文标题】:Lua: problems when using parameters to reference table values 【发布时间】:2021-07-01 23:10:37 【问题描述】:

我在参数方面缺少一些基本的东西。

obj = 
    name = "hey"

function say_name(p,k)
    return p.k
end

print(say_name(obj,name))  --doesn't print "hey"

我不明白为什么这与 print(obj.name) 的输出不同,即“嘿” 更改函数会产生以下情况:

function say_name(p) --works...makes sense to me
    return p.name
end
function say_name(p,k) --doesn't work...why does k not work the same as p?
    return p.k
end
function say_name(p,name) --works....why tho? isn't name a parameter like k is..?
    return p.name
end

是不是因为我用参数引用了一个表值?我错过了一些规则吗?

【问题讨论】:

【参考方案1】:
Try this:

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 Reference Manual - 3.2 Variables

方括号用于索引表格:

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

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

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

 var ::= prefixexp ‘.’ Name

function say_name(p,k) --doesn't work...why does k not work the same as p?
    return p.k
end

p.kp["k"]。和你函数的参数k无关

function say_name(p,name) --works....why tho? isn't name a parameter like k is..?
    return p.name
end

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

【讨论】:

我对你所做的代码更改遇到了同样的问题。即[无] 抱歉忘记了引号。这是sayname(obj, "name")

以上是关于Lua:使用参数引用表值时的问题的主要内容,如果未能解决你的问题,请参考以下文章

表值参数

将表值参数传递给存储过程

在表值 UDF 中断言参数

java中 怎么通过Object对象参数,获取到在传值时的不同子类里的统一方法query

使用 PetaPoco 将表值参数传递给存储过程

使用 ADO.NET 传递表值参数