2016-07-31 60 views
0

我非常新的Lua中,所以虽然我的问题是问一些具体的事情,如果你能提供提供相同结果的答案,请,因为这样做将不胜感激!字符串分割为一个预先定义的表在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

进行访问

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

+0

“*表分配了零变量*”没有这样的事情。你写的和空*表没什么区别。此外,你想用什么标准来划分这个字符串?你如何将特定的分部与表格中的特定名称进行匹配?你的算法看起来不是很好。 –

+0

@NicolBolas够了。我不知道表中定义的变量为零,不存在。正如我所说,新的LUA。该字符串将被空格分开,匹配是按顺序完成的,如果它是一个数组(这可能是一个更好的选择),我希望mytable [0]是Jon,mytable [1]是Jack,等等,但想法是让它们可以通过变量名访问而不需要特定的赋值,所以我基本上可以用字符串中的信息填充一个空的结构。 – user1539405

+0

分割字符串,使表从中http://lua-users.org/wiki/SplitJoin http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html和'为K,V中ipairs({'Name','Age','Gender','Status'})do structure [v] = splitted [k] end' – FareakyGnome

回答

2

你的问题的第一部分,将字符串分割为一个表,可以用这个来完成:

> 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