2009-04-09 21 views
2

これはWoW(World of Warcraft)のluaスクリプトに関する質問です。これらの多くはここで尋ねられることはありませんが、私はどこに向けるべきではなく、Stackoverflowは答えのためのプログラマーのオアシスです。PCALLとは何か、あるいはWowwikiが間違っていますか?

質問:

Wowwikiは、第二、第三、第四引数はあなたの呼び出し元の関数の第一、第二、第三引数であることを述べています。私はこれが本当であるとは思わない。私は第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に' 上CONCATENATEを実行しようとしているのエラーが出ます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'(ゼロ値)を連結するための試み

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(引数1)
  • 機能BobsToolbox:Test1を(ARG1)

答えて

6

Luaのドキュメント:

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

自己パラメータのこの使用は、任意のオブジェクト指向言語における中心点です。ほとんどのオブジェクト指向言語は、このメカニズムをプログラマから部分的に隠しているので、このパラメータを宣言する必要はありません(メソッド内に単語selfまたはthisを使用できます)。 Luaはコロン演算子を使ってこのパラメータを隠すこともできます。私たちは、コロンの効果は、メソッド定義内の余分な隠れたパラメータを追加すると、中に追加の引数を追加することです

a:withdraw(100.00) 

として

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

やメソッド呼び出しなど、以前のメソッドの定義を書き換えることができますメソッド呼び出し。コロンは構文的な機能だけですが、便利なものです。ここには本当に新しいものは何もありません。

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"引数を与えなければならないと思います。

+0

はい、答えを見つけたようです。 BobsToolbox:Test1(arg1)関数を作成すると、pcallを使用している関数名の後の最初の引数が操作対象のオブジェクトであると想定されます。それ以降の引数は、実際に使用したい引数です。 – Venesectrix

+0

はい、これは正しいと思われます。 – AKX

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ファイルにいくつかの変更を行い、入力された:

/コンソールreloadui

を新しい変更を試してみて、自分の画面に結果の出力を持つために。私は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フォルダをクリアし、この機能をテストするために残りのアドオンを無効にすることもできると思います。違いがある場合は、問題が見つかるまでそれらを有効にすることができます。

+0

私はお詫びしますが、私は必要な情報を省いたと思います。当時私はそれが重要だとは思わなかった。あなたが私のエントリーに同意するかどうかを知りたいのですが。 –

2

関連:WoW用の素晴らしいライブコードエディタがあります。私はLuaSlingerを使用していましたが、それはもはや開発されておらず、開発者は代わりにHackをお勧めします。

ただし、ここで発生する可能性があるのは、コロンメソッドコール構文が構文砂糖、メソッド定義のためのIIRCにすぎないということです。基本的に、fooがオブジェクトであるfoo:bar("quux!")を実行すると、実際にはfoo.bar(foo, "quux!")を実行しています。

希望に役立ちます!

+0

私はお詫びしますが、私は必要な情報を省いたと思います。当時私はそれが重要だとは思わなかった。あなたが私のエントリーに同意するかどうかを知りたいのですが。 –

関連する問題