PCALL はどうなっているのでしょうか、それとも Wowwiki は間違っているのでしょうか?
-
06-09-2019 - |
質問
WoW(ワールドオブウォークラフト)の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
結果:文字列値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」引数を指定する必要があると仮定します。
他のヒント
関連:すごいのための素晴らしいライブコードエディタがあります。私はLuaSlingerを使用するために使用されるが、それはもはや先進ませんが判明し、開発者がハックを推奨していますの代わります。
しかし、あなたがここに遭遇する可能性があることは、コロンメソッド呼び出しの構文は、メソッド定義、IIRCのための同上だけの構文糖であるということです。あなたはfooがオブジェクトであるfoo:bar("quux!")
を行う場合、基本的に、あなたは実際にちょうど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ファイルに私のコードを貼り付けし、modは私のキャラクターを選択し、ログインする前にアドオンウィンドウで有効になっていることを確認しました、私はいくつかのソースのluaファイルへの変更などを行わ型付けされます:
/コンソールreloadui
新しい変更を試してみて、私の画面への出力結果を持っています。私はすごいアドオンで多くの作業を行っていないので、私は、あなたを提供するために多くのアドバイスを持っていません。あなたは他に何も干渉されていないことを確認するために空白のアドオンで、このコードを試したことがありますか?あなたは、実際にゲーム内のコードを試してみましたか?あなたが任意のより多くの情報を提供したり、私が何かを試してみたいことができる場合、私に知らせて!
の の更新:さらにいくつかのテストをしようとすることを決めました。ここでは(同じ機能付)のテストがあります:
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あなたは問題を見つけるまでの時間を有効にすることができます。