Domanda

Questa è una WoW (World of Warcraft) domanda di script lua. Non molti di questi stanno per essere chiesto qui, ma non ho a chi rivolgersi e StackOverflow è l'oasi programmatore per le risposte.

Domanda:

wowpedia afferma che il 2 °, 3 °, 4 ° argomenti sono le funzioni di chiamata 1 °, 2 °, 3 argomenti. Non trovo che questo sia vero. Trovo che il 3 °, 4 °, 5 ° argomenti finiscono per essere al 1 °, 2 °, 3 ° argomenti.

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

funzione:

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

Problema:

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

quando provo il campione ottengo un errore di "tentativo di eseguire concatenate su 'arg1' locale (un valore nullo)". Se cambio il codice a:

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

allora ottengo l'uscita di "bob10". Da dove viene il secondo argomento andare e cosa serve?

Più Testing:

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 

Risultati: tentativo per concatenare 'arg1' locale (un valore nullo)

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 

Risultati: stringa value10

Sono nuovo di lua e non riesco a capire il motivo per cui questi sono diversi.

nuova domanda:

I seguenti lavori di codice, ma perché?

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

Qual è la differenza tra i seguenti: (vs "" ":")

  • Funzione BobsToolbox.Test1 (arg1)
  • Funzione BobsToolbox: Test1 (arg1)
È stato utile?

Soluzione

Lua Documentazione:

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

Questo utilizzo di un parametro di sé è un punto centrale in qualsiasi linguaggio orientato agli oggetti. La maggior parte dei linguaggi OO avere questo meccanismo parzialmente nascosto dal programmatore, in modo che lei non ha di dichiarare questo parametro (anche se ancora in grado di usare la parola self o this all'interno di un metodo). Lua può anche nascondere questo parametro, utilizzando l'operatore due punti. Siamo in grado di riscrivere la definizione del metodo precedente,

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

e la chiamata di metodo come

a:withdraw(100.00) 

L'effetto del colon è quello di aggiungere un parametro aggiuntivo nascosto in una definizione di metodo e di aggiungere un argomento in più in una chiamata di metodo. Il colon è solo una struttura sintattica, anche se una facilmente; non c'è nulla di veramente nuovo qui. Siamo in grado di definire una funzione con la sintassi del punto e chiamarlo con la sintassi del colon, o viceversa, a patto che gestiamo il parametro in più correttamente:

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) 

eventuale conclusione:

Con questo in mente suppongo che quando si chiama un ":". Funzione con "PCALL" è necessario fornire l'argomento "auto"

Altri suggerimenti

Related: Ci sono belle editor di codice dal vivo per WoW. Ho usato per usare LuaSlinger, ma scopre che è più sviluppata e lo sviluppatore raccomanda Hack .

Tuttavia, ciò che si potrebbe essere verificato qui è che la sintassi del metodo-call del colon è lo zucchero solo la sintassi, idem per le definizioni di metodo, IIRC. In sostanza, se si fa foo:bar("quux!"), dove foo è un oggetto, si è in realtà solo facendo foo.bar(foo, "quux!").

Speranza che aiuta!

Beh, non credo che wowpedia è sbagliato. Ecco il codice che sto usando:

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);

Ecco l'output ricevo nella mia casella di Generale di chat:

string value10
string value10

Come stai cercando il tuo codice di esempio? . Ho appena incollato il mio codice in un file mod lua esistente e fatto in modo che mod è stato attivato nella finestra addons prima di selezionare il mio carattere e la registrazione in ho fatto un paio di modifiche al file sorgente LUA e digitato:

  

/ console reloadui

Per provare i nuovi cambiamenti e avere l'output risultati al mio schermo. Non ho molti consigli da offrire, perché non ho fatto molto lavoro con WoW addons. Hai provato questo codice in un addon vuoto per assicurarsi che nulla altro sta interferendo? Avete effettivamente provato il codice in gioco? Se si riesce a fornire ulteriori informazioni o vuoi farmi provare qualsiasi altra cosa, fatemelo sapere!

Aggiorna : Abbiamo deciso di provare un paio di test. Ecco le prove (con la stessa funzione):

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

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

E i risultati:

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

E 'interessante il fatto che l'errore che vedo quando arg1 è pari a zero è leggermente diverso da quello l'errore che si vede. Sarei interessato a sapere come si sta testando il codice. O forse non ha copiato l'errore giù Verbatim? Credo che si potrebbe anche provare a sgombrare la cartella WTF e disabilitando il resto dei tuoi addons per provare questa funzione. Se si fa la differenza, allora si può permettere loro una volta fino a trovare il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top