按名称从 table 中解压几个 lua 字段
Unpack several lua fields from a table by name
我可以按名称从 lua 中的 table 中解压几个命名字段吗?我知道我可以使用 table.unpack
将 table 中的编号字段解压缩到单独的变量中,我也可以从 table.
中提取一个命名字段
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
,其中 returns 一个 table 有很多命名字段,我
我只对一些感兴趣。所以目前我在做
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')
。
但你不应该。
如果您将 table 的结构更改为带有 table 的 table,那么您可以更好地控制它。看看这个...
> 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
我可以按名称从 lua 中的 table 中解压几个命名字段吗?我知道我可以使用 table.unpack
将 table 中的编号字段解压缩到单独的变量中,我也可以从 table.
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
,其中 returns 一个 table 有很多命名字段,我
我只对一些感兴趣。所以目前我在做
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')
。
但你不应该。
如果您将 table 的结构更改为带有 table 的 table,那么您可以更好地控制它。看看这个...
> 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