2

これは 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' (nil 値) で連結を実行しようとしています」というエラーが表示されます。コードを次のように変更すると:

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' (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

次の違いは何ですか: ("." と ":")

  • 関数 BobsToolbox.Test1(arg1)
  • 関数 BobsToolbox:Test1(arg1)
4

3 に答える 3

6

Luaドキュメント:

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

この自己パラメータの使用は、オブジェクト指向言語の中心的なポイントです。ほとんどのオブジェクト指向言語では、このメカニズムがプログラマーから部分的に隠されているため、プログラマーはこのパラメーターを宣言する必要はありません(ただし、彼女はまだ単語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」引数を指定する必要があると思います。

于 2009-04-09T14:06:50.473 に答える
2

関連: WoW には素敵なライブ コード エディターがあります。以前は LuaSlinger を使用していましたが、開発されていないことがわかり、開発者は代わりにHackを推奨しています。

ただし、ここで遭遇する可能性があるのは、コロンのメソッド呼び出し構文は単なる構文糖衣であり、メソッド定義、IIRC についても同様です。基本的に、foo:bar("quux!")foo がオブジェクトである場合、実際には を実行しているだけfoo.bar(foo, "quux!")です。

それが役立つことを願っています!

于 2009-04-09T06:29:33.007 に答える
1

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 ファイルに貼り付け、アドオン ウィンドウで mod が有効になっていることを確認してから、キャラクターを選択してログインしました。ソース 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 が nil のときに表示されるエラーが、実際に表示されるエラーとわずかに異なるのは興味深いことです。コードをどのようにテストしているか知りたいです。それとも、エラーをそのままコピーしなかったのでしょうか。WTF フォルダーをクリアし、残りのアドオンを無効にして、この機能をテストすることもできると思います。違いが生じる場合は、問題が見つかるまで一度に 1 つずつ有効にすることができます。

于 2009-04-09T05:53:38.757 に答える