سكالا التحويلات الضمنية:2 طريقة الاستدعاء
سؤال
@لوكاستكس نشر حول مشغل 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.