سؤال

المقاييس باردة. انهم ليسوا فقط لمصفيفات تنفجر، رغم أن هذا هو متعة. يمكن أن يلقي أيضا إلى صفيف ومصفوفات المسطحة (انظر 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]
  • في الفقرة عند بيان الحالة
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top