Pregunta

Esta es una pregunta sobre el guión lua de WoW (World of Warcraft).No se preguntan muchas de estas preguntas aquí, pero no tengo a quién acudir y Stackoverflow es el oasis de los programadores en busca de respuestas.

Pregunta:

Wowwiki afirma que los argumentos segundo, tercero y cuarto son las funciones de llamada argumentos primero, segundo y tercero.No creo que esto sea cierto.Encuentro que los argumentos tercero, cuarto y quinto terminan siendo los argumentos primero, segundo y tercero.

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

Función:

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

Problema:

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

cuando pruebo la muestra, aparece el error "intentar realizar una concatenación en 'arg1' local (un valor nulo)".Si cambio el código a:

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

luego obtengo el resultado de "bob10".¿A dónde va el segundo argumento y para qué sirve?

Más pruebas:

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 

Resultados:intento de concatenar 'arg1' local (un 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:valor de cadena10

Soy nuevo en lua y no puedo entender por qué son diferentes.

Nueva pregunta:

El siguiente código funciona pero ¿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

¿Cuál es la diferencia entre lo siguiente?("." frente a ":")

  • función BobsToolbox.Test1(arg1)
  • función BobsToolbox:Prueba1(arg1)
¿Fue útil?

Solución

Lua Documentación:

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

Este uso de un parámetro de uno mismo es un punto central en cualquier lenguaje orientado a objetos. La mayoría de los lenguajes orientados a objetos tienen este mecanismo parcialmente oculto desde el programador, por lo que no tiene que declarar este parámetro (a pesar de que todavía se puede utilizar la palabra self o this dentro de un método). Lua también puede ocultar este parámetro, usando el operador de colon. Podemos reescribir la definición del método anterior, como

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

y la llamada al método como

a:withdraw(100.00) 

El efecto del colon es para añadir un parámetro oculto extra en una definición del método y para añadir un argumento adicional en una llamada al método. El colon es solamente una instalación sintáctica, aunque es un cómodo uno; no hay nada realmente nuevo. Podemos definir una función con la sintaxis con punto y llamarlo con la sintaxis de colon, o viceversa, siempre y cuando manejamos el parámetro extra correctamente:

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) 

conclusión posible:

Con esto en mente, asumen que cuando se llama a un ":". Función utilizando "pcall" debe proporcionar el argumento de "auto"

Otros consejos

Relacionado:Hay buenos editores de código en vivo para WoW.Solía ​​usar LuaSlinger, pero resulta que ya no está desarrollado y el desarrollador lo recomienda. Cortar a tajos en cambio.

Sin embargo, lo que podría encontrarse aquí es que la sintaxis de llamada al método de dos puntos es solo azúcar de sintaxis, lo mismo ocurre con las definiciones de métodos, IIRC.Básicamente, si lo haces foo:bar("quux!"), donde foo es un objeto, en realidad solo estás haciendo foo.bar(foo, "quux!").

¡Espero que ayude!

Bueno, no creo WoWWiki está mal. Aquí está el código que estoy utilizando:

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

Aquí está la salida de recibo en mi ventana de chat general:

string value10
string value10

¿Cómo está usted tratando el código de ejemplo? . Me acaba de pegar el código en un archivo lua mod existente y se aseguró de que el mod fue habilitada en la ventana de complementos antes de seleccionar mi carácter e inicio de sesión Hice algunos cambios en el archivo lua fuente y escrito:

  

/ consola reloadui

Para probar los nuevos cambios y tienen la salida de los resultados de mi pantalla. No tengo muchos consejos para ofrecerle, porque no he hecho mucho trabajo con WoW complementos. ¿Ha probado este código en un complemento en blanco para asegurarse de que nada más está interfiriendo? ¿Usted ha intentado realmente el código en el juego? Si usted puede proporcionar más información o quieres que probar otra cosa, que me haga saber!

Actualizar : Decidimos probar algunas pruebas más. Éstos son los ensayos (con la misma función):

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

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

Y los resultados:

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

Es interesante que el error que veo cuando arg1 es nulo es un poco diferente que el error que se ve. Yo estaría interesado en saber cómo se está probando su código. O tal vez no copió el error de palabra por palabra? Supongo que podría también intentar despejar su carpeta WTF y desactivar el resto de sus complementos para probar esta función. Si se hace una diferencia, entonces se les puede permitir a uno cada vez hasta que encuentre el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top