在Lua中访问表键affectation的值(右侧)中的键

在Lua中访问表键affectation的值(右侧)中的键,lua,key-value,lua-table,self-reference,Lua,Key Value,Lua Table,Self Reference,目标是将表的键与取决于键的值相匹配 example = { ["dummy"] = this .. " example" } print example.dummy -- print "dummy example" 其中此是指该键的关键字。在Lua中有没有办法做到这一点?没有办法直接做到这一点 您可以进行一些预处理: example = { ["dummy"] = "{THIS} example" } for k,v in pairs(example) do example[k]=v:

目标是将表的键与取决于键的值相匹配

example = { ["dummy"] = this .. " example" }
print example.dummy -- print "dummy example"

其中
是指该键的关键字。在Lua中有没有办法做到这一点?

没有办法直接做到这一点

您可以进行一些预处理:

example = { ["dummy"] = "{THIS} example" }
for k,v in pairs(example) do
    example[k]=v:gsub("{THIS}",k)
end
print(example.dummy)

不可能有像以下那样干净的表达式:

t = { foo = this .. ' bar' }
因为
这个
总是表示为与键或表无关。也就是说,不能将表达式捕获为表项的值

可能的是使用和函数实现某种程度的间接寻址,但这很难做到。在这里,我们进行获取时间评估。您还可以重新计算结果

local function indirect_table ()
    local uptable = {}

    return setmetatable({}, {
        __index = function (self, key)
            local value = uptable[key]

            return type(value) == 'function' and uptable[key](key) or value
        end,
        __newindex = function (self, key, value)
            uptable[key] = value
            --[[precompute, with no need for an uptable, or __index:
                `rawset(self, key, value(key)`]]
        end
    })
end

local tab = indirect_table()

tab.foo = function (key) return key .. 'bar' end

print(tab.foo) --> 'foobar'
注意:本例使用闭包,但也可以使用
getmetatable
实现这种模式


就个人而言,我会将其抽象为一种间接模式,允许指定任意键和值及其操作。我认为这种模式主要是通过编程使用,而不是手工使用,其中键值的结果取决于接收到的输入。同样,不是很漂亮,但是更健壮一些(可选操作)

简单使用:

local function concat (left, right) return left .. right end

local t = T {}

t.foo = K('bar', concat) -- with a common action
t.zar = K({}, unknown_action) -- without action (`nil`)
t.qux = 'qaz' -- standard

print(t.foo, t.zar, t.qux)


这是奇怪的元编程。我会仔细检查需要这种方法的理由。也许你掉进了陷阱?真的感觉像是解决了一个根本不需要存在的问题。

好吧,它适用于我给出的示例,所以这是一个相关的答案。然而,我想到的是使用
this
作为受键影响的匿名函数的参数,比如
example={[“dummy”]=function(k=this)返回k.“example”end
@psycholave,在预处理中,如果
v
是一个函数,则执行
example[k]=v(k)
@Psycholave为什么不在调用时直接传递密钥呢?我使用了lhf建议,它的工作原理与预期一样。您可以看到,这个想法的用法是将世界语词根的弯曲转换为Lua输出脚本中的一些相同标记。大多数情况下,匹配的模式返回目标标记。因此,模式字符串索引函数ions,它在大多数情况下都是使用模式参数化的同一个匿名函数,并且它的EFL返回一个函数,等待最终将提供目标令牌的令牌值。感谢您花时间回答此详细解决方案。我提供了更多关于我的问题的上下文,以及我如何使用选项卡管理它lhf在对其答案的评论中建议的预处理。
local function concat (left, right) return left .. right end

local t = T {}

t.foo = K('bar', concat) -- with a common action
t.zar = K({}, unknown_action) -- without action (`nil`)
t.qux = 'qaz' -- standard

print(t.foo, t.zar, t.qux)