Frage

Dies ist eine WoW (World of Warcraft) Lua Script Frage. Nicht viele von ihnen hier gefragt, aber ich habe keine wo zu drehen und Stackoverflow ist der Programmierer Oase für Antworten.

Frage:

Wowwiki besagt, dass die 2., 3., 4. Argumente sind Ihre Anruffunktionen 1., 2., 3. Argumente. Ich nicht, dass dies wahr zu sein. Ich finde, dass die 3., 4., 5. Argumente 3. Argumente sein, die 1., 2., am Ende.

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 versuche, die Probe ich einen Fehler von „versucht verketten auf lokal‚arg1‘auszuführen (ein Null-Wert)“. Wenn ich den Code zu ändern:

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

dann bekomme ich die Ausgabe von „bob10“. Wo kommt das zweite Argument geht und was 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 Null-Wert)

verketten
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: string value10

Ich bin neu in lua und ich kann nicht verstehen, warum diese unterschiedlich 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 ist der Unterschied zwischen dem folgenden: (vs "" ":")

  • Funktion BobsToolbox.Test1 (arg1)
  • Funktion BobsToolbox: Test1 (arg1)
War es hilfreich?

Lösung

Lua Dokumentation:

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

Diese Verwendung eines Selbst Parameter ist ein zentraler Punkt in jeder objektorientierten Sprache. Die meisten OO-Sprachen haben diesen Mechanismus teilweise von dem Programmierer verborgen, so dass sie diesen Parameter nicht zu erklären haben (obwohl sie immer noch das Wort self oder this innerhalb einer Methode verwenden). Lua kann diesen Parameter auch verstecken, den Doppelpunkt-Operator. Wir können die vorherige Methodendefinition umschreiben als

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

und der Methodenaufruf als

a:withdraw(100.00) 

Die Wirkung des Dickdarms ist ein extra versteckten Parameter in einer Methodendefinition hinzufügen und ein zusätzliches Argument in einem Methodenaufruf hinzuzufügen. Der Doppelpunkt ist nur eine syntaktische Anlage, obwohl eine bequemen ein; es gibt nichts wirklich neu hier. 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 Schlussfolgerung:

diese mit im Auge Ich gehe davon aus, dass beim Aufruf einer „:“. Funktion „pcall“ Sie müssen das „Selbst“ Argument liefern

Andere Tipps

Siehe auch: Es gibt schöne Live-Code-Editoren für WoW. Früher habe ich LuaSlinger verwenden, aber stellt sich heraus, das ist nicht mehr weiterentwickelt und der Entwickler empfiehlt Hack statt.

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

Ich hoffe, das hilft!

Nun, ich glaube nicht, WoWWiki falsch ist. Hier ist der Code verwende ich:

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 bekommen:

string value10
string value10

Wie versuchen Sie Ihren Beispielcode? . Ich klebte nur meinen Code in eine bestehende mod lua-Datei und sorgte dafür, dass mod im Addons Fenster aktiviert wurde, bevor mein Charakter auswählen und anmelden Ich habe ein paar Änderungen an der Quelle lua-Datei und tippte:

  

/ console reloadui

Um die neuen Änderungen versuchen, die Ergebnisse Ausgabe auf meinem Bildschirm. Ich habe nicht viel Beratung zu bieten, weil ich nicht viel Arbeit mit WoW Addons getan haben. Haben Sie diesen Code in einem leeren Addon versucht, sonst sicher nichts zu machen stört? Haben Sie versucht, den Code tatsächlich in Spiel? Wenn Sie weitere Informationen zur Verfügung stellen können oder wollen, dass ich etwas anderes versuchen, lassen Sie es mich wissen!

Aktualisieren : Beschlossen ein paar Tests, um 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 Null ist als der Fehler ist etwas anders als Sie zu sehen. Es würde mich interessieren, wie Sie Ihren Code testen. Vielleicht haben Sie den Fehler nicht kopieren wörtlich nach unten? Ich denke, Sie auch Ihre WTF Ordner versuchen könnte, Ausräumen und deaktivieren Sie den Rest des Addons diese Funktion zu testen. Wenn es einen Unterschied macht, dann kann man sie ein eine Zeit ermöglichen, bis Sie das Problem zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top