2010-09-04 11 views
8

Ich komme aus einem Python-Hintergrund und mag die Power von Python Decorators.Unterstützt Lua Decorators?

Unterstützt Lua Decorators?

Ich habe den folgenden Link lesen, aber es ist mir unklar: http://lua-users.org/wiki/DecoratorsAndDocstrings

UPDATE

Möchten Sie ein Beispiel gegeben, wie etwas ausmachen, wie es in Lua zu implementieren, wenn es möglich ist.

+1

Lua kann Wrapper um Funktionen genauso gut implementieren wie Python; es hat einfach keine spezielle Syntax dafür, da Lua eine sehr einfache Kernsyntax haben will (zu einem Fehler, da es so grundlegende Dinge wie 'continue' und' + = 'nicht gibt). –

Antwort

9

Die auf der von Ihnen zitierten Seite dokumentierten "Decorators" (und zum Beispiel in this one zum Hinzufügen von Typprüfungen verwendet) haben wenig mit Pythons seltsamer "Dekoratorsyntax" zu tun, um eine höhere Ordnung anzuwenden Funktion (HOF) - vielmehr sind die in Lua's Wiki beschriebenen und verwendeten Dekoratoren ein Lua-Idiom, um eine Anwendung der Decorator Design Pattern auf Lua-Funktionen zu unterstützen (durch Halten von "zusätzlichen Attributen" - wie Docstrings, Tychecking-Funktionen usw.) separate globale Tabellen).

Lua tut Unterstützung Höfs (Ich bin nicht sicher, ob Sie einen Funktionsnamen auf das Ergebnis der Anwendung einer HOF auf die Funktion erneut binden können, aber Sie können leicht, wie die Wiki-Seiten zeigen, eine anonyme verwenden "original function" und bindet nur einen Namen an das HOF-Ergebnis mit dieser anon-Funktion als arg.

Pythons "Decorator Syntax" Syntax Zucker ist nett (und zu meiner Überraschung, scheint die Verwendung von HOFs von den meisten Pythonistas um eine Größenordnung erhöht! -), aber es gibt nichts intrinsisch oder wesentlich an ihnen, dass Sie kann nicht in Lua tun (und Lua's anonyme Funktionen führen Kreis um Pythons doof, begrenzt lambda sowieso - genau wie in Javascript haben sie im Wesentlichen die gleiche Macht und so ziemlich die gleiche Syntax, wie eine "normale" benannte Funktion! -).

+1

würde es Ihnen etwas ausmachen, ein Beispiel zu geben, wie man einen HOF in Lua implementiert. Danke – nickb

+1

@user, die Wiki-Seite, die du zitiert hast, ist voll von solchen Beispielen - Funktionen, die Funktionsargumente nehmen und/oder Funktionsergebnisse zurückgeben (das ist was eine Funktion höherer Ordnung, alias HOF, ** ist ** per Definition ;-) . Ich glaube nicht, dass es einen zusätzlichen Wert für mich geben würde, irgendwelche dieser Beispiele oder Variationen darauf zu kopieren und einzufügen! –

+2

Funktionen in Lua sind erstklassige Werte. Sie haben eigentlich keine Namen. Sie binden einen Namen an eine Funktion, indem Sie ihn in einer Variablen dieses Namens speichern. Um eine bestehende Funktion erneut zu binden, ersetzen Sie einfach ihren Wert, wobei Sie natürlich bei Bedarf den Zugriff auf den alten Wert beibehalten müssen. – RBerteig