Question

Ceci est un WoW (World of Warcraft) question de script Lua. Pas beaucoup d'entre elles seront posées ici, mais je n'ai pas où tourner et Stackoverflow est l'oasis de programmeur pour trouver des réponses.

Question:

WoWWiki indique que les 2e, 3e, 4e arguments sont vos fonctions d'appel 1er, 2e, 3e arguments. Je ne trouve pas que cela soit vrai. Je trouve que le 3ème, 4ème, 5ème arguments finissent par être les 1er, 2e, 3e arguments.

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

Fonction:

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

Problème:

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

lorsque je tente l'échantillon que je reçois une erreur de « essayer d'effectuer concatenate sur « arg1 » locale (une valeur nulle) ». Si je change le code:

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

je reçois la sortie de « bob10 ». D'où vient le 2ème argument de aller et quel est-il?

Plus de 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 

Résultats: tentative de concaténer locale 'arg1' (une valeur nulle)

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 

Résultats: value10 string

Je suis nouveau à lua et je ne comprends pas pourquoi ils sont différents.

Nouvelle Question:

Les travaux de code suivant, mais pourquoi?

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

Quelle est la différence entre ce qui suit: (vs "" ":")

  • Fonction BobsToolbox.Test1 (arg1)
  • Fonction BobsToolbox: Test1 (arg1)
Était-ce utile?

La solution

Documentation Lua:

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

Cette utilisation d'un paramètre de soi est un point central dans tout langage orienté objet. La plupart des langages OO ont ce mécanisme partiellement caché du programmeur, de sorte qu'elle n'a pas à déclarer ce paramètre (même si elle peut encore utiliser le mot self ou this intérieur d'une méthode). Lua peut également masquer ce paramètre, en utilisant l'opérateur du côlon. On peut réécrire la définition précédente de la méthode comme

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

et l'appel de méthode en tant que

a:withdraw(100.00) 

L'effet du côlon est d'ajouter un paramètre supplémentaire caché dans une définition de méthode et d'ajouter un argument supplémentaire dans un appel de méthode. Le côlon est seulement une installation syntaxique, mais une pratique; il n'y a rien de vraiment nouveau ici. Nous pouvons définir une fonction avec la syntaxe point et l'appeler avec la syntaxe du côlon, ou vice-versa, aussi longtemps que nous traitons le paramètre supplémentaire correctement:

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) 

Conclusion possible:

Dans cet esprit, je suppose que lorsque vous appelez un « : ». Fonction à l'aide « pcall » vous devez fournir l'argument « auto »

Autres conseils

Related: Il y a de beaux éditeurs de code en direct pour WoW. Je l'habitude d'utiliser LuaSlinger, mais se révèle que ce n'est plus développé et le développeur Hack à la place.

Cependant, ce que vous pourriez rencontrez ici que la syntaxe méthode d'appel du côlon est le sucre juste syntaxe, idem pour les définitions de méthode, IIRC. En gros, si vous le faites foo:bar("quux!"), où foo est un objet, vous êtes en réalité juste faire foo.bar(foo, "quux!").

L'espoir qui aide!

Eh bien, je ne pense pas que WoWWiki est faux. Voici le code que je utilise:

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

Voici la sortie que je reçois dans ma boîte de chat générale:

string value10
string value10

Comment essayez-vous de votre exemple de code? . Je viens collais mon code dans un fichier lua mod existant et fait en sorte que mod a été activé dans la fenêtre addons avant de choisir mon personnage et vous connecter, je fait quelques modifications au fichier lua source et tapé:

  

/ reloadui console

Pour essayer les nouveaux changements et les résultats ont sortie à mon écran. Je n'ai pas beaucoup de conseils à vous offrir, parce que je ne l'ai pas fait beaucoup de travail avec WoW addons. Avez-vous essayé ce code dans un addon vide pour assurer que rien n'interfère autre? Avez-vous déjà essayé le code dans le jeu? Si vous pouvez fournir plus d'informations ou me voulez essayer quoi que ce soit d'autre, laissez-moi savoir!

Mise à jour : avons décidé d'essayer quelques tests. Voici les tests (avec la même fonction):

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

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

Et les résultats:

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

Il est intéressant de noter que l'erreur que je vois quand arg1 est nul est légèrement différente de celle de l'erreur que vous voyez. Je serais intéressé à savoir comment vous testez votre code. Ou peut-être vous n'avez pas copié l'erreur mot pour mot? Je suppose que vous pouvez également essayer effacer votre dossier WTF et désactiver le reste de addons pour tester cette fonction. Si cela fait une différence, vous pouvez les activer une fois jusqu'à ce que vous trouviez le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top