2016-06-02 6 views
1
importiert

Ich habe ein Problem mit Variablen in Tabellen. Dies ist wichtig, da ich Tabellen als Konfiguration für mein Programm verwende.lua, Zeichenketten mit Variablen in Tabellen kombiniert, wenn aus der Datei

so habe ich den folgenden Code getestet, das funktioniert:

> x = "X" 
> t = {["ref"]="table with value: "..x} 
> print(t["ref"]) 
table with value: X 
> x = "Y" 
> t = {["ref"]="table with value: "..x} 
> print(t["ref"]) 
table with value: Y 

es jedoch nicht ohne den zweiten > t = ["ref"]="table with value: "..x

jetzt funktioniert ich das in mein Hauptprogramm Hexe besteht aus zwei Dateien zu implementieren ging , eine Hexe gibt die Konfigurationstabelle zurück. Und eine Datei mit allen Funktionen und Sachen. es sieht aus wie folgt

FILE A (main.lua):

testString = "test1" 
print(testString) 
local CONFIG = require'config' 
print(CONIFG[1].test) 
testString = "test2" 
print(testString) 
local CONFIG = require'config' 
print(CONIFG[1].test) 

FILE B (config.lua):

local CONFIG = { 
      {["test"]=[[this is a test: ]]..testString} 
      } 
return CONFIG 

jetzt, wenn ich Datei A laufen (aka main.lua) ich bekomme die folgende Ausgabe:

test1 
this is a test: test1 
test2 
this is a test: test1 

ich kann nicht herausfinden, was ich falsch hier tue .. ich dachte, dass es etwas mit dem zu tun hatte, dass es ein si ngle String so gemacht i testString eine Tabelle, aber das gab mir das gleiche Ergebnis ...

(dieser Titel wirklich scheint unheimlich .. sorry)

Antwort

4

require, durch Design, speichert den Rückgabewert. Wenn Sie also require mit der gleichen Zeichenfolge aufrufen, wird das Skript nicht erneut ausgeführt. Es wird einfach den zuvor zurückgegebenen Wert zurückgeben.

require ist zum Laden von Modulen. Und Module sollten ihre Rückgabewerte nicht basierend auf einem anderen globalen Status ändern.

Die Funktion, die Sie wahrscheinlich suchen, ist dofile. Dies wird immer die Datei laden und ausführen (aber es hat keine Pfadsuche Eigenschaften von require). Alternativ können Sie loadfile verwenden, um die Datei als eine Funktion zu laden, und dann diese Funktion ausführen, um die Tabelle wann immer Sie möchten neu zu erstellen.

auch:

Ich habe ein Problem mit Variablen innerhalb von Tabellen mit.

Es gibt keine "Variablen in Tabellen". Oder zumindest nicht wie du meinst. In Erwartung einer Änderung einer Variablen einen anderen Wert zu beeinflussen ist, wie dies erwartet:

a = 5 
b = a + 5 
a = 10 
assert(b == 15, "This will never be true.") 

Wenn ein Ausdruck (ob a + 5 oder "table with value: " .. x) ausgewertet wird, ist es in einem Wert führt. Der resultierende Wert ist in keiner Weise abhängig von einem Wert oder einer Variablen aus dem Ausdruck, der ihn generiert hat.

Deshalb mussten Sie den Wert neu generieren; weil sich die Werte nicht ändern, nur weil sich einige Variablen ändern.

+0

Vielen Dank .. ich dachte, Require ausgeführt die Zeichenfolge, als es aufgerufen wurde ... auch "Ich habe ein Problem mit Variablen in Tabellen."Es könnte eine falsche Beschreibung gewesen sein ... es tut mir leid, aber danke für deine Klarstellung: D – subject546

+0

Das Programm arbeitet jetzt mit folgendem Code' local CONFIGf = assert (loadfile ("config.lua")) '' local CONFIG = CONFIGf() 'oder' local CONFIG = assert (loadfile ("config.lua"))() 'wenn du oneliner magst; p – subject546