سؤال

هذه هي نجاح باهر (عالم علب) سؤال نصي لوا. لا يطلب الكثير من هذه من هنا ولكن ليس لدي أي مكان للتحول و 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 الخاص بك وتعطيل بقية المندونات الخاصة بك لاختبار هذه الوظيفة. إذا تحدث فرقا، فيمكنك تمكينهم من وقت واحد حتى تجد المشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top