هل هناك method_missing في Scala؟
-
29-09-2019 - |
سؤال
على غرار واحد في روبي
المحلول
ما يلي لم يعد صحيحًا تمامًا مع Dynamic
سمة موجودة في [التجريبية] Scala 2.9. انظر الإجابة من Kipton Barros ، على سبيل المثال.
لكن، Dynamic
مازال ليس تماما مثل method_missing
, ، ولكن يستخدم سحر التحويل البرمجي لإعادة كتابة المكالمات بشكل فعال إلى "مفقود" الأساليب ، كما هو محدد بشكل ثابت ، إلى وكيل (applyDynamic
). إنه نهج تحديد الأساليب "المفقودة" التي تميزها عن "المفقودة" method_missing
من وجهة نظر تعدد الأشكال: يحتاج المرء إلى محاولة و إلى الأمام ديناميكيا (على سبيل المثال مع الانعكاس) أساليب للحصول على حقيقة method_missing
سلوك. (بالطبع يمكن تجنب هذا من خلال تجنب الأنواع الفرعية :-)
لا. مثل هذا المفهوم غير موجود في جافا أو سكالا.
مثل Java ، تكون جميع الطرق في Scala "ملزمة" في وقت الترجمة (وهذا يحدد أيضًا الطريقة المستخدمة في التحميل الزائد ، إلخ). إذا تم تجميع البرنامج ، فإن الطريقة المذكورة موجودة (أو فعلت وفقًا للمترجم) ، وإلا فإنه لا يفعل ذلك. لهذا السبب يمكنك الحصول على لا هذا خطأ الطريقة إذا قمت بتغيير تعريف الفصل دون إعادة بناء جميع الفصول المتأثرة.
إذا كنت قلقًا فقط من محاولة استدعاء طريقة على كائن يتوافق مع توقيع ("كتابة البط المكتوب") ، فربما تتمكن من الابتعاد الكتابة الهيكلية. الكتابة الهيكلية في Scala هي الوصول السحري على الانعكاس - وبالتالي فإنها تشويش "الربط" حتى يتم إنشاء وقت التشغيل وخطأ وقت التشغيل. على عكس method_missing ، لا يسمح هذا استهداف للتعامل مع الخطأ ، ولكنه يسمح للمتصل (ويمكن للمتصل أن يطلق نظريًا على طريقة SISSISMISS المحددة على الهدف ... ولكن ربما لا تكون هذه هي أفضل طريقة للتعامل مع Scala. Scala ليست روبي :-)
نصائح أخرى
نعم, ، اعتبارا من سكالا 2.9 مع -Xexperimental
الخيار ، يمكن للمرء استخدام Dynamic
سمة (Scaladoc). الطبقات التي تمتد Dynamic
احصل على الطريقة السحرية applyDynamic(methodName, args)
الذي يتصرف مثل روبي method_missing
.
من بين أشياء أخرى ، Dynamic
يمكن أن تكون السمة مفيدة للتفاعل مع اللغات الديناميكية على JVM.
ليس صحيحا. لا معنى له. Scala هي لغة من النوع الثابت والتي ترتبط بها الأساليب في وقت الترجمة ؛ روبي هي لغة مملوءة بالديناميكي رسائل يتم تمريرها إلى الكائنات ، ويتم تقييم هذه الرسائل في وقت التشغيل ، مما يتيح لـ Ruby التعامل مع الرسائل التي لا تستجيب لها مباشرة ، à la method_missing
.
يمكنك التقليد method_missing
بعدة طرق في Scala ، لا سيما باستخدام مكتبة الجهات الفاعلة ، ولكنها ليست هي نفسها (أو ما يقرب من سهلة) مثل روبي method_missing
.
لا ، هذا غير ممكن في Scala 2.8 وما قبل.