2009-04-09 4 views
2

Dies ist eine WoW (World of Warcraft) lua Skript Frage. Nicht viele von ihnen werden hier gefragt, aber ich habe keine Stelle, an die ich mich wenden kann, und Stackoverflow ist die Programmieroase für Antworten.Was ist mit PCALL oder ist Wowwiki falsch?

Frage:

Wowwiki besagt, dass die 2., 3., 4. Argumente Ihre Anruffunktionen 1. sind, 2., 3. Argumente. Ich finde das nicht wahr. Ich finde, dass das 3., 4., 5. Argument das 1., 2., 3. Argument ist.

-Link: http://www.wowwiki.com/API_pcall

Funktion:

function myTest(arg1) 
    return arg1 .. 10; 
end 

Problem:

local retOK, ret1 = pcall(myTest,"string value"); 

, wenn ich die Probe versuchen, erhalte ich einen Fehler von „versucht verketten auf lokale 'arg1' auszuführen (ein Nullwert) ". Wenn ich den Code zu:

local retOK, ret1 = pcall(myTest,"string value", "bob"); 

ändere, dann bekomme ich die Ausgabe von "bob10". Wohin geht das 2. Argument und wofür ist es?

Weitere Tests:

function BobsToolbox:RunTest() 
    local test1, value1 = pcall(BobsToolbox.Test1, "string value"); 
    SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1)); 
end 

function BobsToolbox:Test1(arg1) 
    return arg1 .. "10"; 
end 

Ergebnisse: Versuch local 'arg1' (ein Nullwert)

function BobsToolbox:RunTest() 
    local test1, value1 = pcall(Test1, "string value"); 
    SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1)); 
end 

function Test1(arg1) 
    return arg1 .. "10"; 
end 

Ergebnisse zu verketten: string value10

Ich bin neu in lua und ich kann nicht verstehen, warum diese anders sind.

Neue Frage:

Der folgende Code funktioniert, aber warum?

function BobsToolbox:RunTest() 
    local test1, value1 = pcall(BobsToolbox.Test1, "string value"); 
    SharpDeck:Print("Test1: " .. tostring(test1) .. " Value: " .. tostring(value1)); 
end 

function BobsToolbox.Test1(arg1) 
    return arg1 .. "10"; 
end 

Was zwischen folgenden ist der Unterschied: (vs "" ":")

  • Funktion BobsToolbox.Test1 (arg1)
  • Funktion BobsToolbox: Test1 (arg1)

Antwort

6

Lua Dokumentation:

http://www.lua.org/pil/16.html

Diese Verwendung eines selbst-Parameter ist ein zentraler Punkt in beliebigen objektorientierten Sprache. Die meisten OO-Sprachen haben diesen Mechanismus teilweise vom Programmierer versteckt, so dass sie diesen Parameter nicht deklarieren muss (obwohl sie immer noch das Wort self oder this innerhalb einer Methode verwenden kann). Lua kann diesen Parameter auch mit dem Doppelpunkt-Operator verbergen. Wir können die vorherigen Methodendefinition umschreiben als

function Account:withdraw (v) 
    self.balance = self.balance - v 
end 

und den Methodenaufruf als

a:withdraw(100.00) 

Die Wirkung des Dickdarms ist ein extra versteckte Parameter in einer Methodendefinition hinzufügen und ein zusätzliches Argument hinzuzufügen, in ein Methodenaufruf Der Doppelpunkt ist nur eine syntaktische Einrichtung, obwohl eine bequeme; Hier gibt es nichts wirklich Neues.Wir können eine Funktion mit der Punkt-Syntax definieren und es mit der Doppelpunkt-Syntax aufrufen, oder umgekehrt, solange wir den zusätzlichen Parameter richtig behandeln:

Account = { balance=0, 
    withdraw = function (self, v) 
     self.balance = self.balance - v 
    end 
} 

function Account:deposit (v) 
    self.balance = self.balance + v 
end 

Account.deposit(Account, 200.00) 
Account:withdraw(100.00) 

Mögliche Fazit:

Mit diesem Ich nehme an, dass beim Aufruf einer ":" - Funktion mit "pcall" das Argument "self" angegeben werden muss.

+0

Ja, es sieht so aus, als ob Sie die Antwort gefunden haben! Wenn Sie die Funktion BobsToolbox: Test1 (arg1) erstellen, wird erwartet, dass das erste Argument nach dem Funktionsnamen mit pcall das zu bearbeitende Objekt ist. Das Argument danach ist das Argument, das Sie tatsächlich verwenden möchten. – Venesectrix

+0

Ja, das scheint ungefähr richtig zu sein. – AKX

1

Nun, ich denke nicht, dass WoWWiki falsch liegt. Hier ist der Code Ich verwende:

function myTest(arg1) return arg1 .. 10; end 

local retOK, ret1 = pcall(myTest,"string value"); 
DEFAULT_CHAT_FRAME:AddMessage(ret1); 

local retOK, ret1 = pcall(myTest,"string value", "bob"); 
DEFAULT_CHAT_FRAME:AddMessage(ret1); 

Hier ist die Ausgabe ich in meiner Allgemeinen Chat-Box erhalten:

string value10 
string value10 

Wie versuchen Sie Ihren Beispielcode? Ich habe meinen Code einfach in eine existierende Mod-Lua-Datei eingefügt und sichergestellt, dass Mod im Addons-Fenster aktiviert wurde, bevor ich meinen Charakter auswähle und mich einlogge.Ich habe ein paar Änderungen an der lua Dateiquelle und tippte:

/console reloadui

Um die neuen Änderungen zu versuchen, die Ergebnisse Ausgabe auf meinem Bildschirm. Ich habe nicht viele Ratschläge, die ich euch anbieten kann, weil ich nicht viel mit WoW-Addons gearbeitet habe. Hast du diesen Code in einem leeren Addon ausprobiert, um sicherzustellen, dass nichts anderes störend ist? Hast du den Code tatsächlich im Spiel ausprobiert? Wenn Sie weitere Informationen zur Verfügung stellen können oder etwas anderes ausprobieren möchten, lassen Sie es mich wissen!

Update: Entschieden, ein paar weitere Tests zu versuchen. Hier sind die Tests (mit der gleichen Funktion):

local retOK, ret1 = pcall(myTest,""); 
DEFAULT_CHAT_FRAME:AddMessage(ret1); 

local retOK, ret1 = pcall(myTest, nil, "bob"); 
DEFAULT_CHAT_FRAME:AddMessage(ret1); 

Und die Ergebnisse:

10 
attempt to concatenate local 'arg1' (a nil value) 

Es ist interessant, dass der Fehler ich sehe, wenn arg1 ist gleich Null ist etwas anders als der Fehler, den Sie sehen. Ich wäre daran interessiert zu wissen, wie Sie Ihren Code testen. Oder hast du den Fehler nicht wörtlich kopiert? Ich schätze, du könntest auch versuchen, deinen WTF-Ordner zu löschen und den Rest deiner Addons zu deaktivieren, um diese Funktion zu testen. Wenn es einen Unterschied macht, können Sie sie einmal aktivieren, bis Sie das Problem finden.

+0

Ich entschuldige mich, aber ich denke, ich habe benötigte Informationen weggelassen. Zu dieser Zeit hielt ich es nicht für wichtig. Wenn Sie möchten, würde ich gerne sehen, ob Sie meinem Eintrag zustimmen. –

2

Verwandt: Es gibt nette Live-Code-Editoren für WoW. Früher habe ich LuaSlinger benutzt, aber es stellt sich heraus, dass es nicht mehr entwickelt ist und der Entwickler stattdessen Hack empfiehlt.

Was Sie hier jedoch finden könnten, ist, dass die Doppelpunkt-Methode-Aufruf-Syntax nur Syntax Zucker ist, dito für Methodendefinitionen, IIRC. Grundsätzlich, wenn Sie foo:bar("quux!") tun, wo foo ein Objekt ist, tun Sie in Wirklichkeit nur foo.bar(foo, "quux!").

Hoffe, dass hilft!

+0

Ich entschuldige mich, aber ich denke, ich habe benötigte Informationen weggelassen. Zu dieser Zeit hielt ich es nicht für wichtig. Wenn Sie möchten, würde ich gerne sehen, ob Sie meinem Eintrag zustimmen. –