2015-02-12 11 views
5

In Programmierung in Lua (3. Aufl.) von Roberto Ierusalimschy wird angegeben, dassErklärung über „local foo = foo“ Idiom in Lua

Ein gemeinsames Idiom in Lua

local foo = foo

ist

Dieser Code erstellt eine lokale Variable, foo, und initialisiert sie mit dem Wert der globalen Variablen foo. (Die lokale foo sichtbar wird erst nach seiner Erklärung.) Das Idiom ist nützlich, wenn der Chunk benötigt den ursprünglichen Wert von foo sogar zu erhalten, wenn später eine andere Funktion ändert den Wert des globalen foo; es beschleunigt auch den Zugriff auf foo.

Könnte jemand das genauer erklären und ein einfaches Beispiel geben?

Im Moment kann ich nur an dieses Idiom denken, wenn man lokale Variablen (in einem bestimmten Block) verwaltet, die dieselben Namen wie globale Variablen haben, so dass die globale Variable nach dem Block unverändert bleibt .

Ein Beispiel:

foo = 10 
do 
    local foo = foo 
    foo = math.log10(foo) 
    print(foo) 
end 
print(foo) 

ergibt dies:

1 
10 

Aber das gleiche, ohne das Idiom erreicht werden könnte, überhaupt:

bar = 10 
do 
    local bar = math.log10(bar) 
    print(bar) 
end 
print(bar) 

, die das gleiche Ergebnis liefert. Meine Erklärung scheint also nicht zu stimmen.

Antwort

2

Die Erklärung ist richtig; Ich bin mir nicht sicher, warum Sie mit Ihrem Beispiel nicht zufrieden sind. Um Ihnen ein konkretes Beispiel:

local setfenv = setfenv 
if not setfenv then -- Lua 5.2+ 
    setfenv = function() ..... end 
end 

Ein weiterer Grund ist, den Wert zu erhalten, wie es in diesem Moment ist, so dass andere Funktionen, die diesen Wert verwenden (in einer Datei oder ein Modul) die gleichen Erwartungen haben würden über dieser Wert.

+2

@PierPaolo, Weil die Änderung nur im aktuellen Blog wirksam wird. Wenn Sie 'local setfenv = setfenv' nicht machen, ist der Effekt außerhalb des aktuellen Blocks sichtbar, was in diesem Fall nicht erwünscht ist. –

2

Wrapping a global: (., Die übrigens ein lokal)

do 
    local setmetatable = setmetatable 
    function _ENV.setmetatable(...) 
    -- Do your thing 
    return setmetatable(...) 
    end 
end 

Reduzierung der Overhead durch einen lokalen anstelle einer Suche in der Globals-Tabelle zu tun:

local type = type 
for k, v in next, bigtable do 
    if type(v) == "string" then 
    -- Do one thing 
    else 
    -- Do other thing 
    end 
end 
3

Ich habe gesehen, dass dies häufiger als Optimierungstechnik verwendet wird, als um die ursprünglichen Werte zu erhalten. Mit dem Standard-Lua-Interpreter erfordert jeder globale Variablenzugriff und jeder Modulzugriff eine Tabellensuche. Lokale Variablen haben andererseits statisch bekannte Stellen bei der Bytecode-Kompilierungszeit und können in VM-Registern platziert werden.

In mehr Tiefe: Why are local variables accessed faster than global variables in lua?

2

Ich denke, man Haarspalterei ist, unabsichtlich.

local bar = math.log10(bar)

ist im Wesentlichen die gleiche wie local bar = bar im Geiste, aber wir, es wäre weniger nützlich zu behaupten, dass das Idiom ist local bar = a(bar), weil wir die lokalen in irgendeiner Weise anders als Gabe an ein zu handhaben möchten Funktion zuerst - z es an etwas anhängen.

Dieser Punkt ist, dass wir auf die lokale bar verweisen möchten, genau wie Sie sagen, nicht genau, wie die Konvertierung von globalen zu lokalen erfolgt.

Verwandte Themen