【问题标题】:In lua, array sub elementlua中,数组子元素
【发布时间】:2017-02-09 16:25:56
【问题描述】:

在 Lua 中, 我想选择数组的部分。 下面的例子从第二个元素中选择

a = { 1, 2, 3}
print(a)

b = {}
for i = 2, table.getn(a) do
  table.insert(b, a[i])
end
print(b)

在 python 中 a[1:] 有效。 Lua有类似的语法吗?

【问题讨论】:

  • 请不要使用table.getn(t),这是不好的做法,请使用#t

标签: arrays lua lua-table


【解决方案1】:

Lua 没有类似的语法。但是,您可以定义自己的函数来轻松包装此逻辑。

local function slice (tbl, s, e)
    local pos, new = 1, {}
    
    for i = s, e do
        new[pos] = tbl[i]
        pos = pos + 1
    end
    
    return new
end

local foo = { 1, 2, 3, 4, 5 }
local bar = slice(foo, 2, 4)

for index, value in ipairs(bar) do
    print (index, value)
end

请注意,这是foobar 中元素的 副本。


或者,在 Lua 5.2 中,您可以使用 table.packtable.unpack

local foo = { 1, 2, 3, 4, 5 }
local bar = table.pack(table.unpack(foo, 2, 4))

虽然说明书上是这么说的:

table.pack (···)

返回一个新表,其中所有参数都存储在键 1、2 等中,并带有一个包含参数总数的字段“n”。请注意,结果表可能不是序列。


虽然 Lua 5.3 有 table.move:

local foo = { 1, 2, 3, 4, 5 }
local bar = table.move(foo, 2, 4, 1, {})

最后,大多数人可能会选择在此之上定义某种 OOP 抽象。

local list = {}
list.__index = list

function list.new (o)
    return setmetatable(o or {}, list)
end

function list:append (v)
    self[#self + 1] = v
end

function list:slice (i, j)
    local ls = list.new()
    
    for i = i or 1, j or #self do
        ls:append(self[i])
    end
    
    return ls
end

local foo = list.new { 1, 2, 3, 4, 5 }
local bar = foo:slice(2, 4)

【讨论】:

    猜你喜欢
    • 2015-11-17
    • 2014-05-21
    • 2015-11-14
    • 1970-01-01
    • 2014-05-06
    • 2021-06-10
    • 2020-01-23
    • 2013-11-27
    • 2019-12-17
    相关资源
    最近更新 更多