Вопрос

Это вопрос по сценарию WoW (World of Warcraft) lua.Здесь задают не многие из этих вопросов, но мне не к кому обратиться, а Stackoverflow - это оазис программиста для ответов.

Вопрос:

Wowwiki утверждает, что 2-й, 3-й, 4-й аргументы являются вашими вызывающими функциями 1-го, 2-го, 3-го аргументов.Я не нахожу, что это правда.Я нахожу, что 3-й, 4-й, 5-й аргументы в конечном итоге являются 1-м, 2-м, 3-м аргументами.

Ссылка: http://www.wowwiki.com/API_pcall

Функция:

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

Проблема:

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

когда я пробую образец, я получаю сообщение об ошибке "пытаюсь выполнить конкатенацию для локального 'arg1' (нулевое значение)".Если я изменю код на:

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

затем я получаю результат "bob10".Куда ведет 2-й аргумент и для чего он нужен?

Еще одно Тестирование:

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 

Результаты:попытка объединить локальный 'arg1' (нулевое значение)

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 

Результаты:строковое значение10

Я новичок в lua и не могу понять, почему они отличаются.

Новый Вопрос:

Следующий код работает, но почему?

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

В чем разница между следующим:("." против ":")

  • функция BobsToolbox.Test1(arg1)
  • функция BobsToolbox:Test1(arg1)
Это было полезно?

Решение

Документация Lua:

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

Это использование параметра self является центральным моментом в любом объектно-ориентированном языке.Большинство языков OO имеют этот механизм, частично скрытый от программиста, так что ей не нужно объявлять этот параметр (хотя она все еще может использовать слово self или this внутри метода).Lua также может скрыть этот параметр, используя оператор двоеточия.Мы можем переписать предыдущее определение метода следующим образом

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

и вызов метода как

a:withdraw(100.00) 

Эффект двоеточия заключается в добавлении дополнительного скрытого параметра в определение метода и в добавлении дополнительного аргумента при вызове метода.Двоеточие - это всего лишь синтаксическое средство, хотя и удобное;здесь нет ничего действительно нового.Мы можем определить функцию с синтаксисом точки и вызвать ее с синтаксисом двоеточия, или наоборот, при условии правильной обработки дополнительного параметра:

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) 

Возможный Вывод:

Имея это в виду, я предполагаю, что при вызове функции ":" с использованием "pcall" вы должны указать аргумент "self".

Другие советы

Похожие:Для WoW есть отличные редакторы живого кода.Раньше я использовал LuaSlinger, но оказалось, что он больше не разработан, и разработчик рекомендует Взломать вместо этого.

Однако здесь вы можете столкнуться с тем, что синтаксис вызова метода двоеточия - это просто синтаксический сахар, то же самое для определений методов, IIRC.В принципе, если вы делаете foo:bar("quux!"), где foo - это объект, на самом деле вы просто делаете foo.bar(foo, "quux!").

Надеюсь, это поможет!

Ну, я не думаю, что WoWWiki ошибается.Вот код, который я использую:

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

Вот результат, который я получаю в моем Общем окне чата:

string value10
string value10

Как вы пробуете свой пример кода?Я просто вставил свой код в существующий файл mod lua и убедился, что мод включен в окне дополнений, прежде чем выбрать моего персонажа и войти в систему.Я внес несколько изменений в исходный файл lua и набрал:

/перезагрузка консоли

Чтобы опробовать новые изменения и вывести результаты на мой экран.У меня не так много советов, которые я мог бы вам предложить, потому что я не так уж много работал с аддонами WoW.Вы пробовали этот код в пустом аддоне, чтобы убедиться, что больше ничего не мешает?Вы действительно пробовали код в игре?Если вы можете предоставить какую-либо дополнительную информацию или хотите, чтобы я попробовал что-нибудь еще, дайте мне знать!

Обновить:Решил попробовать еще несколько тестов.Вот тесты (с той же функцией):

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

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

И результаты:

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

Интересно, что ошибка, которую я вижу, когда arg1 равен нулю, немного отличается от ошибки, которую видите вы.Мне было бы интересно узнать, как вы тестируете свой код.Или, может быть, вы не скопировали ошибку дословно?Я думаю, вы также могли бы попробовать очистить свою папку WTF и отключить остальные ваши дополнения, чтобы протестировать эту функцию.Если это имеет значение, то вы можете включать их по одному до тех пор, пока не обнаружите проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top