أين هو قانوني لاستخدام مشغل روبي الروبي؟
-
13-09-2019 - |
سؤال
المقاييس باردة. انهم ليسوا فقط لمصفيفات تنفجر، رغم أن هذا هو متعة. يمكن أن يلقي أيضا إلى صفيف ومصفوفات المسطحة (انظر http://github.com/mischa/splat/tree/master. للحصول على قائمة شاملة لما يفعلونه.)
يبدو أن المرء لا يستطيع إجراء عمليات إضافية على Splat، ولكن في 1.8.6 / 1.9 يلقي التعليمات البرمجية التالية "TSSAR غير متوقع":
foo = bar || *zap #=> unexpected tSTAR
في حين أن هذا يعمل:
foo = *zap || bar #=> works, but of limited value
أين يمكن أن تظهر splat في تعبير؟
المحلول
أولا، الأسبقية ليست مشكلة هنا، ل foo = bar || (*zap)
لا يعمل بشكل أفضل. القاعدة العامة للإبهام هي أنه لا يمكنك إجراء عمليات إضافية على Splat. حتى شيء بسيط مثل foo = (*zap)
غير صالح. هذا ينطبق على 1.9 كذلك.
بعد أن قال ذلك، ماذا تتوقع foo = bar || *zap
القيام به، إذا كان يعمل، وهذا يختلف عن foo = bar || zap
ب حتى في حالة مثل a, b = bar || *zap
(الذي لا يعمل أيضا)، a, b = bar || zap
ينجز ما أفترض أنه سيكون نفس الشيء.
الوضع الوحيد الذي قد يجعل هذا أي معنى شيء مثل a, b = foo, bar || *zap
. وبعد يجب أن تجد أن معظم الحالات التي تريد استخدامها مغطاة بها a, b = foo, *(bar || zap)
. وبعد إذا لم يغطي ذلك قضيتك، فمن المحتمل أن تسأل نفسك ما تأمل حقا في إنجازه عن طريق كتابة مثل هذا الإنشاء القبيح.
تعديل:
ردا على تعليقاتكم، *zap || bar
أي ما يعادل *(zap || bar)
. وبعد وهذا يدل على مدى انخفاض الأسبقية SPLAT. بالضبط كم هو منخفض؟ أفضل إجابة يمكنني أن أقدمها لك "منخفضة جدا".
مثال مثير للاهتمام، رغم ذلك، فكر في طريقة foo
التي تأخذ ثلاث حجج:
def foo(a, b, c)
#important stuff happens here!
end
foo(*bar = [1, 2, 3])
سوف Splat بعد المهمة وتعيين الحجج إلى 1 و 2 و 3 على التوالي. قارن ذلك مع foo((*bar = [1, 2, 3]))
والتي سوف تشكو من وجود عدد خاطئ من الحجج (1 لمدة 3).
نصائح أخرى
"مشغل SPLAT" هو في الواقع ليس مشغلا على الإطلاق ولكن رمزية محددة في قواعد اللغة الروبي. قراءة من خلال Grammar.Y أو قواعد اللغة الروبي في نموذج BNF * سيخبرك أنه يسمح بالوسيطة الأخيرة أو الوحيدة:
- في تعريف الطريقة (باستثناء الماضي الاختياري
&foo
) - في استدعاء طريقة (باستثناء الأخير الاختياري
&foo
) - على LHS كعمل، على سبيل المثال:
a, b, *cs = [1,2,3,4]
- على RHS من مهمة، على سبيل المثال:
a, b, c = 1, 2, *[3,4,5]
- في الفقرة عند بيان الحالة