سؤال

@لوكاستكس نشر حول مشغل Java Elvis، وحاولت شيئًا ما في Scala للحصول على نفس التأثير.

لقد قمت للتو بتحويل كل شيء إلى نوع هيكلي جديد باستخدام ملف ?: يأخذ المشغل كائنًا من نفس نوع الوسيطة.أقول ذلك:

implicit def toRockStar[B](v : B) = new { 
                            def ?:(opt: => B) = if (v == null) opt else v}
val name: String = "Paulo" // example

لماذا name ?: "Lucas" يحصل على "Lucas" و name.?:{"Lucas"} يحصل على Paulo؟من المفترض أن يقوم النوع الهيكلي الجديد بإرجاع القيمة الأولية لأي شيء إذا كان كذلك هو ليس لاشيء, ، إنه، "Paulo" في الكود أعلاه.

أنا مرتبك بعض الشيء.أي تفسير؟

هل كانت مفيدة؟

المحلول

ينتهي المشغل الخاص بك بـ :, ، مما يعني أنه يُقرأ من اليمين إلى اليسار عند استخدام تدوين infix.على سبيل المثال:

scala> 1 :: Nil == Nil.::(1)
res2: Boolean = true

تُقرأ جميع الطرق من اليسار إلى اليمين بتدوين نقطي.لذلك أنت في الواقع تطبق طريقتك على Lucas في تدوين infix، و name في تدوين النقطة.

بالمناسبة، كان مشغل الفيس غير مقبول لإدراجها في جافا 7.

نصائح أخرى

للسجل (العثور على هذا الموضوع أثناء البحث مرة أخرى في المقالة التالية...)، نشر دانييل سبيواك (دانيال مشهور آخر في عالم سكالا...) مقالًا عن تنفيذ مشغل Groovy's Elvis في Scala.

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