【问题标题】:Splitting a string into a pre-defined table in Lua将字符串拆分为 Lua 中的预定义表
【发布时间】:2016-12-05 20:15:54
【问题描述】:

我对 Lua 很陌生,所以虽然我的问题是问一些具体的问题,但如果你能提供一个提供相同结果的答案,请这样做,我们将不胜感激!

基本上我有一个字符串和一个分配有空变量的结构:

mystring = "Jon 21 Male Alive"

some_sort_of_structure { Name, Age, Gender, Status}

基本上我想以某种方式将四个名称分配给结构中的变量,并通过变量名从表中访问它们。

字符串将被空格分割,每个值都根据它们的顺序分配。但是,我不能按名称分配变量。即

some_sort_of_structure.Name = "Jon"

它需要简单地通过它在结构中的位置来访问变量,即

some_sort_of_structure[0] = "Jon" -- With [0] being Name

但之后我需要能够使用 some_sort_of_structure.Name 访问它

这里的主要目的是为字符串预先设置存储并将该字符串正确存储在存储中。

【问题讨论】:

  • "用 nil 变量分配的表" 没有这样的东西。你写的和 empty 表没什么区别。此外,你想用什么标准来划分这个字符串?您如何将特定部门与表中的特定名称匹配?您的算法似乎没有经过深思熟虑。
  • @NicolBolas 够公平的。我不知道表中定义的变量,因为 nil 不存在。正如我所说,LUA 的新手。字符串将被空格分割,匹配只是按顺序完成,如果它是一个数组(这可能是一个更好的选择)我希望 mytable[0] 是 Jon,mytable[1] 是 Jack 等等,但想法是让它们可以通过变量名访问而无需特定分配,所以我基本上可以用字符串中的信息填充一个空结构。
  • 拆分字符串以从中创建表格 lua-users.org/wiki/SplitJoin inf.puc-rio.br/~roberto/lpeg/lpeg.htmlfor k,v in ipairs({'Name', 'Age', 'Gender', 'Status'}) do structure[v]=splitted[k] end

标签: split lua lua-table


【解决方案1】:

问题的第一部分,将字符串拆分为表格,可以这样做:

> function s2t (s)
>>     local t = {}
>>     for v in s:gmatch("(%w*)") do
>>         t[#t+1] = v
>>     end
>>     return t
>> end
> for k,v in pairs(s2t "Jon 21 Male Alive") do print(k,v) end 
1   Jon
2   21
3   Male
4   Alive
> 

您可以使用__index 元方法扩展此内容以解决问题的第二部分。

> k2i = {Name = 1, Age = 2, Gender = 3, Status = 4}
> function s2t (s)
>>     local t = {}
>>     local function idx (table, key)
>>         return t[k2i[key]]
>>     end
>>     local mt = {__index = idx} 
>>     for v in s:gmatch("(%w*)") do
>>         t[#t+1] = v
>>     end
>>     return setmetatable(t,mt)
>> end
> mytable = s2t "Jon 21 Male Alive"
> for k,v in pairs(mytable) do print(k,v) end
1   Jon
2   21
3   Male
4   Alive
> mytable.Name
Jon
> mytable.Gender
Male
> 

idx 函数和元表可以被所有实例共享,而不是被关闭(“upvalues”)。这是那个版本:

k2i = {Name = 1, Age = 2, Gender = 3, Status = 4}

kmt = {__index = function (table, key) return table[k2i[key]] end} 

function s2t (s)
    local t = {}
    for v in s:gmatch("(%w*)") do
        t[#t+1] = v
    end
    return setmetatable(t, kmt)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 2015-01-16
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多