في لوا ، هل يمكنني بسهولة تحديد النتيجة التاسعة بدون وظائف مخصصة؟
-
01-10-2019 - |
سؤال
لنفترض أنني أدخل سلسلة في جدول على النحو التالي:
table.insert(tbl, mystring)
وذلك mystring
يتم إنشاؤه عن طريق استبدال جميع حوادث "A" مع "B" في input
:
mystring = string.gsub(input, "a", "b")
الطريقة الواضحة لدمج الاثنين في بيان واحد لا تعمل ، لأن gsub
يعيد نتيجتين:
table.insert(tbl, string.gsub(input, "a", "b")) -- error!
-- (second result of gsub is passed into table.insert)
والتي ، أفترض ، هو السعر المدفوع لدعم قيم العائد المتعددة. والسؤال هو ، هل هناك طريقة قياسية ومضمنة لتحديد قيمة الإرجاع الأولى فقط؟ عندما وجدت select
اعتقدت أن هذا هو بالضبط ما فعلته ، ولكن للأسف ، فإنه يختار بالفعل الكل نتائج من N فصاعدا ، وبالتالي لا تساعد في هذا السيناريو.
الآن أعلم أنه يمكنني تحديد خاص بي select
كالآتي:
function select1(n, ...)
return arg[n]
end
table.insert(tbl, select1(1, string.gsub(input, "a", "b")))
لكن هذا لا يبدو صحيحًا ، لأنني أتوقع طريقة مدمجة للقيام بذلك.
إذن ، هل أفتقد بعض البناء المدمج؟ إذا لم يكن الأمر كذلك ، فهل يميل مطورو LUA إلى استخدام متغير منفصل لاستخراج الوسيطة الصحيحة أو كتابة خاصة بهم select1
المهام؟
المحلول
يمكنك أن تحيط بالتعبير عن طريق الأقواس:
table.insert(tbl, (string.gsub(input, "a", "b")))
هذا سيختار فقط النتيجة الأولى.
للحصول على النتيجة التاسعة ، يمكنك استخدام select
وتحيط به من قبل الأقواس:
func1( (select(n, func2())) )
نصائح أخرى
وضع تعبير في أقواس مثل هذا:
table.insert(tbl, (string.gsub(input, "a", "b")))
سوف يجبر قيمة عائد واحد. أو يمكنك القبض عليهما هكذا:
str,cnt = string.gsub(input, "a", "b")
table.insert(tbl, str)
أو حتى الأفضل ، تلتقطها الدمية لحفظ متغير:
str,_ = string.gsub(input, "a", "b")
table.insert(tbl, str)
في سطر واحد: ({ funct(args) })[n]
سيعود النتيجة n'th دون إعلان أي متغيرات تسمية.