Pergunta

Este é um WoW (World of Warcraft) pergunta script Lua. Não muitos destes get perguntou aqui, mas eu não tenho para onde se virar e Stackoverflow é o oásis programador de respostas.

Pergunta:

WoWWiki afirma que as 2ª, 3ª, 4ª argumentos são as suas funções de chamada do 1º, 2º, 3º argumentos. Eu não acho que isso seja verdade. Acho que a 3ª, 4ª, 5ª argumentos acabam sendo o 1º, 2º, 3º argumentos.

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

Função:

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

Problema:

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

quando eu tentar o exemplo eu recebo um erro de "tentar executar concatenate em 'arg1' local (um valor nulo)". Se eu alterar o código para:

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

então eu começo a saída do "bob10". Onde é que o segundo argumento ir eo que é isso?

Mais de teste:

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 

Resultado: tentativa de 'arg1' concatenate local (um valor nulo)

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 

Resultados: string value10

Eu sou novo para lua e eu não consigo entender porque estes são diferentes.

Nova Pergunta:

As seguintes obras de código, mas por quê?

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 é a diferença entre o seguinte: (vs "" ":")

  • função BobsToolbox.Test1 (arg1)
  • função BobsToolbox: Test1 (arg1)
Foi útil?

Solução

Documentação Lua:

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

Este uso de um parâmetro auto é um ponto central em qualquer linguagem orientada a objetos. A maioria das linguagens OO têm este mecanismo parcialmente escondida do programador, de modo que ela não tem que declarar esse parâmetro (embora ela ainda pode usar a palavra self ou this dentro de um método). Lua também pode esconder esse parâmetro, usando o operador de cólon. Podemos reescrever a definição do método anterior como

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

e a chamada de método como

a:withdraw(100.00) 

O efeito do cólon é adicionar um parâmetro oculto extra em uma definição de método e para adicionar um argumento extra em uma chamada de método. O cólon é apenas uma instalação de sintática, embora uma conveniente; não há nada realmente novo aqui. Podemos definir uma função com a sintaxe de ponto e chamá-lo com a sintaxe cólon, ou vice-versa, enquanto lidamos com o parâmetro extra corretamente:

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) 

conclusão possível:

Com isto em mente, eu supor que ao chamar um ":". Função usando "pcall" você deve fornecer o "self" argumento

Outras dicas

Relacionado: Há bons editores de código ao vivo para WoW. Eu costumava usar LuaSlinger, mas acontece que não é mais desenvolvido e o desenvolvedor recomenda Corte .

No entanto, o que você pode estar encontrando aqui é que o cólon sintaxe do método-call é o açúcar apenas sintaxe, idem para definições de métodos, IIRC. Basicamente, se você fizer foo:bar("quux!"), onde foo é um objeto, você está, na realidade, apenas fazendo foo.bar(foo, "quux!").

Espero que ajude!

Bem, eu não acho que WoWWiki está errado. Aqui está o código que estou 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);

Aqui está a saída eu chegar na minha caixa de bate-papo Geral:

string value10
string value10

Como você está tentando o seu código de exemplo? I acabou de colar meu código em um arquivo lua mod existente e que garantir que mod foi habilitado na janela de complementos antes de escolher o meu personagem e registro no I fez algumas alterações no arquivo fonte lua e digitou:.

/ console reloadui

Para experimentar as novas mudanças e ter a saída de resultados para minha tela. Eu não tenho muitos conselhos para lhe oferecer, porque eu não tenho feito muito trabalho com WoW addons. Você já tentou esse código em um addon em branco para garantir que nada mais está interferindo? Você realmente tentei o código no jogo? Se você puder fornecer mais informações ou quer que eu tente qualquer outra coisa, me avise!

Atualizar : Decidiu tentar mais alguns testes. Aqui estão os testes (com a mesma função):

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

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

E os resultados:

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

É interessante que o erro que eu vejo quando arg1 é nulo é um pouco diferente do que o erro que você vê. Eu estaria interessado em saber como você está testando seu código. Ou talvez você não copiar o erro abaixo na íntegra? Eu acho que você também pode tentar limpar a sua pasta WTF e desativando o resto de seus complementos para testar esta função. Se ele faz a diferença, então você pode permitir-lhes um de cada vez até encontrar o problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top