ما هو مع PCALL أو هو Wowwiki خطأ؟
-
06-09-2019 - |
سؤال
هذه هي نجاح باهر (عالم علب) سؤال نصي لوا. لا يطلب الكثير من هذه من هنا ولكن ليس لدي أي مكان للتحول و Stackoverflow هو واحة مبرمج للحصول على إجابات.
سؤال:
تنص Wowwiki على أن الحجج الثانية والثالثة والثالثة هي وظائف المكالمات الأولية الأولى والثانية والثانية. لا أجد هذا صحيحا. أجد أن الحجج الثالثة والرابعة والثالثة في نهاية المطاف في الحجج الأولى والثانية والثانية.
وصلة: 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
النتائج: سلسلة القيمة 10
أنا جديد في لوا ولا أستطيع أن أفهم لماذا هذه مختلفة.
سؤال جديد:
الكود التالي يعمل ولكن لماذا؟
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)
المحلول
وثائق لوا:
http://www.lua.org/pil/16.html.
هذا الاستخدام لمعلمة ذاتية هي نقطة مركزية في أي لغة موجهة للكائنات. معظم لغات OO لديها هذه الآلية مخفية جزئيا عن المبرمج، بحيث لا يجب أن تعلن هذه المعلمة (على الرغم من أنها لا تزال تستطيع استخدام الكلمة self
أو this
داخل الطريقة). يمكن لوا أيضا إخفاء هذه المعلمة، باستخدام مشغل القولون. يمكننا إعادة كتابة تعريف الطريقة السابقة
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"، يجب أن توفر وسيطة "الذات".
نصائح أخرى
ذات صلة: هناك محرري رمز Live Live ل WOW. اعتدت استخدام LuaSlinger، لكنه اتضح أنه لم يعد متطورا ويوصي المطور خلف في حين أن.
ومع ذلك، ما قد تصادفه هنا هو أن بناء جملة أسلوب القولون - مكالمة هو فقط Syntax Sugar، DITTO لتعريفات الطريقة، IIRC. أساسا، إذا كنت تفعل 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
كيف تحاول نموذج التعليمات البرمجية؟ أنا فقط لصق الرمز الخاص بي في ملف وزارة الدفاع موجودة وتأكد من تمكين وزارة الدفاع في نافذة الإضافات قبل تحديد شخصيتي وتسجيل الدخول. لقد قمت بإجراء بعض التغييرات على ملف LUA المصدر والمكتبت:
/ وحدة التحكم Roadui.
لتجربة التغييرات الجديدة والحصول على إخراج النتائج على شاشتي. ليس لدي الكثير من النصائح التي نقدمها لك، لأنني لم أفعل الكثير من العمل مع WOW Edons. هل جربت هذا الرمز في ملحق فارغ للتأكد من أن أي شيء آخر يتداخل؟ هل حاولت فعلا الرمز في اللعبة؟ إذا كنت تستطيع تقديم أي معلومات أخرى أو تريدني أن أجرب أي شيء آخر، فأعلمني!
تحديث: قررت تجربة عدد قليل من الاختبارات. فيما يلي الاختبارات (مع نفس الوظيفة):
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 الخاص بك وتعطيل بقية المندونات الخاصة بك لاختبار هذه الوظيفة. إذا تحدث فرقا، فيمكنك تمكينهم من وقت واحد حتى تجد المشكلة.