عند استخدام تدوينات التباين أو الحدود العامة في سكالا
-
01-10-2019 - |
سؤال
في تباين Scala يمكن تعريفها مع مشغلي التباين مثل + و - على وسيطة النوع العام. على سبيل المثال List
النوع متغير في المكتبة القياسية.
class List[+A]
لذلك يمكن تعريف وظيفة مع قائمة المتغيرات مثل هذا:
def foo[A](list : List[A])
كما يمكن محاكاة التباين مع حدود عامة. لذلك يمكننا أيضًا كتابة هذا
def foo[A](list : List[_:< A])
بالطبع هذا لا معنى له ، لأن list
متغير بالفعل. ولكن يمكن القيام بنفس الخدعة لأنواع غير متغيرة. (مثل Stack
). بالطبع ، يمكن أيضًا إنشاء أنواع جديدة من Stack (ميراث التجميع) المتغير.
لذلك أسئلتي:
- متى يجب استخدام الحدود العامة للتباين؟ ومتى يجب أن ننشئ نوعًا جديدًا متغيرًا؟
- هي الحدود العامة مفيدة فقط للتباين ، أو هل يمكن أن تعلن المزيد (مفاهيم اللغة).
- إذا كانت مفيدة فقط للتباين ، فهي حدود ثم فقط للتوافق مع Java؟
شكرا مقدما :)
المحلول
إذا كان النوع متغيرًا بشكل طبيعي أو مخالف ، فيجب عليك إعلان ذلك. سوف يشكرك المستخدمون على ذلك. تباين موقع الاستخدام موجود بالفعل في الغالب بسبب جافا. بتعبير أدق ، نوع مثل Array[T <: Number]
يعامل على أنه اختصار لنوع وجودي:
ArrayBuffer[T] forSome { type T <: Number }
الأنواع الوجودية لها بناء جملة ضخمة في Scala. هذا أمر مقصود ، لأننا لا نوصيك باستخدامها كثيرًا. متى ستحتاج إلى نوع وجودي؟
- لكتابة التناظرية لنوع جافا مع أحرف البرية ، مثل
List<? extends Number>
. - لكتابة التناظرية من نوع Java Raw ، مثل
List
.
في Java ، لا تكون الأنواع الأولية وأنواع البطاقات البرية هي نفسها تمامًا ولا تشبه تمامًا نوع الوجود (على الرغم من أننا نعرف ما هي عليه ، فمن الصعب للغاية تحديد ما هي عليه على وجه التحديد). لكنها قريبة بما يكفي للوجودي في الممارسة العملية ، بحيث تفلت سكالا مع رسم خرائط لها إلى هذا النوع من النوع.
نصائح أخرى
- عند إنشاء نوع عام جديد ، قل foo [t] ، يجب أن تحاول بجد تحديد ما إذا كان هذا النوع متغيرًا أو متناقضًا أو ثابتًا وإعلانه foo [+t] أو foo [-t] أو foo [t] على التوالي. من المسلم به أن هذا يمكن أن يكون صعبا بعض الشيء. ومع ذلك ، فإنه يحرر من مستخدم اتخاذ هذا القرار في كل مرة تحتاج فيها إلى استخدام FOO باستخدام الحدود العامة. باختصار: تفضل تباين موقع الإعلان على تباين موقع الاتصال عندما يكون التباين خاصية من النوع نفسه.
راجع للشغل ، فإن البرمجة في كتاب سكالا من تأليف مارتن أودرسكي وليكس سبون وبيل فينز لديها بعض الوظائف البحرية الرائعة حول التباين. انظر الفصل 19 نوع المعلمة.