문제

이것은 와우 (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'(nil 값)에서 컨텍스트를 수행하려는 오류가 발생합니다. 코드를 변경하면 :

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

그런 다음 "bob10"의 출력을 얻습니다. 두 번째 논쟁은 어디로 가고 무엇을위한 것인가?

더 많은 테스트 :

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'(nil 값)을 연결하려는 시도

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 

결과 : 문자열 value10

나는 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

다음의 차이점은 무엇입니까 : ( "."vs ":")

  • 기능 bobstoolbox.test1 (arg1)
  • 기능 bobstoolbox : test1 (arg1)
도움이 되었습니까?

해결책

LUA 문서 :

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

자체 매개 변수의 이러한 사용은 모든 객체 지향 언어의 중심점입니다. 대부분의 OO 언어에는이 메커니즘이 프로그래머로부터 부분적으로 숨겨져 있으므로이 매개 변수를 선언 할 필요는 없습니다 (여전히 단어를 사용할 수는 있지만 self 또는 this 방법 내부). LUA는 콜론 연산자를 사용 하여이 매개 변수를 숨길 수도 있습니다. 이전 메소드 정의를 다시 작성할 수 있습니다

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

그리고 방법은 다음과 같이 호출됩니다

a:withdraw(100.00) 

결장의 효과는 메소드 정의에 추가 숨겨진 매개 변수를 추가하고 메소드 호출에 추가 인수를 추가하는 것입니다. 결장은 단지 구문 시설이지만 편리한 시설입니다. 여기에는 정말 새로운 것이 없습니다. 추가 매개 변수를 올바르게 처리하는 한 다음과 같이 DOT 구문으로 함수를 정의하고 콜론 구문으로 호출 할 수 있습니다.

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 "을 사용하여"함수를 호출 할 때 "자기"인수를 제공해야한다고 가정합니다.

다른 팁

관련 : 와우를위한 멋진 라이브 코드 편집기가 있습니다. 나는 Luaslinger를 사용했지만 더 이상 개발되지 않았고 개발자는 추천합니다. 마구 자르기 대신에.

그러나 여기서 만날 수있는 것은 결장 메소드-집안 구문이 단지 구문 설탕, 방법 정의를위한 ditto, IIRC라는 것입니다. 기본적으로, 그렇다면 foo:bar("quux!"), foo가 대상인 곳, 당신은 실제로 foo.bar(foo, "quux!").

도움이되기를 바랍니다!

글쎄, 나는 와우 위키가 틀렸다고 생각하지 않는다. 다음은 내가 사용하는 코드입니다.

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 파일에 붙여서 문자를 선택하고 로그인하기 전에 Addons 창에서 Mod가 활성화되어 있는지 확인했습니다. 소스 LUA 파일을 몇 가지 변경하여 다음을 입력했습니다.

/콘솔 Reloadui

새로운 변경 사항을 시도하고 결과를 화면에 출력하십시오. WOW Addons와 많은 일을하지 않았기 때문에 제공 할 조언이별로 없습니다. 이 코드를 공백 애드온에서 시도하여 다른 것이 방해되는지 확인 했습니까? 실제로 게임에서 코드를 사용해 보셨습니까? 더 많은 정보를 제공하거나 다른 것을 시도해 볼 수 있다면 알려주세요!

업데이트: 몇 가지 테스트를 시도하기로 결정했습니다. 테스트는 다음과 같습니다 (동일한 기능) :

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이 nil 일 때 보는 오류가 당신이 보는 오류와 약간 다르다는 것이 흥미 롭습니다. 코드를 테스트하는 방법을 알고 싶습니다. 아니면 verbatim 아래로 오류를 복사하지 않았을까요? 또한 WTF 폴더를 지우고 나머지 애드온을 비활성화 하여이 기능을 테스트 할 수도 있습니다. 그것이 차이를 만들면 문제를 찾을 때까지 한 번에 하나를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top