2016-07-31 34 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