Warum bewirkt die Verwendung von ... in einem beliebigen Ausdruck in einer Funktion, dass der Wert von arg in Lua gleich Null ist?

8
%Vor%

Warum verwendet ... in einem Ausdruck den Wert von arg auf
sei nil z. mit print("value of implicit table:",...) oder select(1,...) ?

    
Segfault 08.09.2013, 00:22
quelle

1 Antwort

14

Lua 5.1 lehnt die Verwendung der Tabelle arg für varargs offiziell ab und bevorzugt ... . Es gibt jedoch eine Kompilierzeitoption für Lua selbst, LUA_COMPAT_VARARG , um die Verwendung von arg in 5.1-Code zu ermöglichen.

Wenn LUA_COMPAT_VARARG definiert wurde, als Lua kompiliert wurde, wird eine arg -Tabelle in varargs-Funktionen erstellt und mit den Argumenten gefüllt - es sei denn, der Compiler erkennt die Verwendung von ... in der Funktion. In diesem Fall wird davon ausgegangen, dass Sie varargs im 5.1-Format anstelle von 5.0 verwenden und die Tabelle nicht erstellen. It tut jedoch immer noch den lokalen Namen arg !

Wenn% code% definiert ist, erhalten vararg Funktionen, die LUA_COMPAT_VARARG nicht im Body enthalten, eine ... mit der Argumentliste und vararg Funktionen, die tun Erhalte ein local arg mit local arg . Dieser Fehler ist in allen Versionen von 5.1 vorhanden und bedeutet insbesondere, dass Sie nicht auf einen globalen Wert oder upvalue mit dem Namen nil von einer varargs-Funktion zugreifen können, wenn arg zur Kompilierzeit definiert wurde.

Lua 5.2 lässt die Unterstützung für LUA_COMPAT_VARARG -style varargs vollständig fallen und hat daher dieses Problem nicht, unabhängig davon, wie es zur Kompilierzeit konfiguriert wurde.

(Quelle: Die Änderungen in varargs, die zwischen 5.0 und 5.1 und die Option arg betreffen, werden in Das Referenzhandbuch Lua 5.1, Abschnitt 7.1 . Das Handbuch verweist Sie auf luaconf.h < Das genaue Verhalten ist nirgendwo dokumentiert, soweit ich weiß, es kann experimentell bestimmt werden, indem man lparser.c und ldo.c , oder von der Einträge in der Mailingliste, die dieses Problem ursprünglich gemeldet haben.)

    
ToxicFrog 08.09.2013, 00:36
quelle