返回同一表的参数

假设有一个表格:

t = {
    { name = "Bob", age = 34, gender = "男性"},
    { name = "Bill", age = 40, gender = "男性"},
    { name = "Barbara", age = 20, gender = "女性"}
}

使用姓名作为索引,要返回或打印 Bob 的年龄或 Barbara 的性别,需要做什么?

更准确地说,当姓名为“Bob”或其他名称时,需要调用一个获取年龄的函数和另一个获取性别的函数。

点赞
用户107090
用户107090

根据你的表格,执行以下操作:

for i=1,#t do
        t[t[i].name]=t[i]
end

然后就可以使用名称来访问字段了:

print(t["Bob"].age, t["Bob"].gender)
2016-07-10 12:04:59
用户734069
用户734069

有几种处理的方式。显而易见的方法就是遍历整个表格,直到找到所需的元素:

function FindByName(name)
    for i = 1, #t do
        if(t[i].name == name) then return t[i] end
    end
    assert(false, "Could not find name " .. name)
end

因此,你可以调用 FindByName("Bob").gender 来获取特定的字段。

然而,如果你知道你将经常按名称查找,你可以修改数组,使其具有相同的名称键。在构建数组之后,调用此函数:

function MapToName(t)
    for i = 1, #t do
        t[t[i].name] = t[i]
    end
end

这将允许你用 t[名称] 查找该条目。

这种方法的缺点是,每次添加元素、删除元素或更改元素名称时,你都需要相应地修改表格。如果更改元素的名称,则必须将 t[旧名称] 设置为 nil,并将 t[新名称] 设置为该值。

但对于静态表格,这样做可以接受。

2016-07-10 14:14:22