按名称解压缩表中的几个lua字段

问题描述

我可以按名称从lua中的表中解压缩几个命名字段吗?我知道我可以使用table.unpack将表中的编号字段解压缩为单独的变量,也可以从表中仅提取一个命名字段。

local a,b = table.unpack({1,2,3})
print(a,b) -- will print "1    2"
local t = {some=1,stuff=2}
local field = t.some
print(field) -- will print "1"

但是我想知道是否有等同于PHP的以下内容

$x = ["a"=>1,"b"=>2,"c"=>3];
list("a"=>$a,"c"=>$c) = $x;
echo "$a $c";  // will print "1 3"

我的用例是一个require,它返回一个包含许多命名字段的表,而我 我只对某些感兴趣。所以目前我在做

local a = require("file/where/I/just/need/one/field").the_field
local tmp = require("file/that/returns/table/with/many/fields")
local b,c = tmp.x,tmp.y

但是我想知道我是否可以在一行上完成第二个。

解决方法

如果您打算经常执行该操作,则可以定义一个函数:

local function destruct (tbl,...)
    local insert = table.insert
    local values = {}
    for _,name in ipairs {...} do
        insert (values,tbl[name])
    end
    return unpack(values)
end

-- Test:
local a,b = destruct ({a = 'A',b = 'B',c = 'C'},'a','b')
print ('a = ' .. tostring (a) .. ',b = ' .. tostring (b))

因此,在您的示例中,它将是:local b,c = destruct (require 'file/that/returns/table/with/many/fields','x','y')

但是你不应该。

,

如果更改表的结构以将其解压缩为包含表的表,则可以对其进行更多控制。看看...

> test={{},{},{}}
> test[1]={one=1,two=2,three=3}
> test[2]={eins=1,zwei=2,drei=3}
> test[3]={uno=1,dos=2,tres=3}
> check=table.unpack(test,1)
> check.one
1
> check.two
2
> check.three
3
> check=table.unpack(test,2)
> check.eins
1
> check.zwei
2
> check.drei
3
> check=table.unpack(test,3)
> check.uno
1
> check.dos
2
> check.tres
3

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...