2016-07-31 15 views
0

Ich bin ziemlich neu zu Lua, also während meine Frage etwas Spezifisches fragt, wenn Sie eine Antwort liefern können, die das gleiche Ergebnis liefert, tun Sie bitte so, wie es geschätzt würde !Eine Zeichenfolge in eine vordefinierte Tabelle in Lua zerlegen

Grundsätzlich habe ich einen String und eine Struktur mit leeren Variablen zugewiesen:

mystring = "Jon 21 Male Alive" 

some_sort_of_structure { Name, Age, Gender, Status} 

Grundsätzlich würde Ich mag irgendwie die vier Namen auf die Variablen in einer Struktur zuordnen und sie aus der Tabelle zugreifen, indem Sie die Variablennamen .

Die Zeichenfolge wird durch Leerzeichen getrennt und jeder Wert wird anhand ihrer Reihenfolge zugewiesen. Allerdings kann ich die Variable nicht nach Namen zuweisen.

dh
some_sort_of_structure.Name = "Jon" 

Es würde die Variable einfach durch, wo zugreifen müssen, ist es in der Struktur, dh

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

Aber danach würde ich muss es zugreifen können mit some_sort_of_structure.Name

Das Hauptziel hier ist jedoch, einen voreingestellten Speicher für eine Zeichenfolge zu haben und diese Zeichenfolge korrekt im Speicher zu speichern.

+0

"* Tabelle mit Null Variablen zugewiesen *" Es gibt keine solche Sache. Was Sie geschrieben haben, unterscheidet sich nicht von einer * leeren * Tabelle. Welche Kriterien möchten Sie verwenden, um diese Zeichenfolge zu teilen? Wie ordnen Sie eine bestimmte Abteilung mit einem bestimmten Namen in der Tabelle zusammen? Ihr Algorithmus erscheint nicht sehr gut durchdacht. –

+0

@ NicolBolas Fair genug. Ich kannte keine Variable, die in einer Tabelle definiert wurde, da sie nicht existierte. Wie ich schon sagte, neu bei LUA. Die Zeichenfolge wird durch Leerzeichen getrennt, die Anpassung erfolgt einfach nach der Reihenfolge, wenn es ein Array ist (was eine bessere Option sein kann) Ich möchte, dass mytable [0] Jon ist, mytable [1] Jack und so weiter , aber die Idee ist, sie durch einen Variablennamen ohne spezifische Zuweisung zugänglich zu machen, so dass ich im Grunde eine leere Struktur mit Informationen aus dem String ausfüllen kann. – user1539405

+0

Split-String, um Tabelle daraus zu machen http://lua-users.org/wiki/SplitJoin http://www.inf.puc-rio.br/~roberto/lpeg/lpeg.html und 'für k, v in ipairs ({'Name', 'Alter', 'Geschlecht', 'Status'}) strukturieren [v] = gespalten [k] Ende ' – FareakyGnome

Antwort

2

Der erste Teil Ihrer Frage, eine Zeichenfolge in eine Tabelle aufteilen, kann damit fertig werden:

> 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 
> 

Sie diese erweitern können den zweiten Teil Ihrer Frage mit einem __index metamethod zu adressieren.

> 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 
> 

Die idx Funktion und Metatabelle kann von allen Instanzen gemeinsam genutzt werden, anstatt geschlossen über werden („upvalues“). Hier ist diese Version:

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 
Verwandte Themen