"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > هل يمكن تجاوز القيود المفروضة على اتحاد الأدوية العامة من خلال استدعاء الأساليب المشتركة دون إعلان واجهة صريح؟

هل يمكن تجاوز القيود المفروضة على اتحاد الأدوية العامة من خلال استدعاء الأساليب المشتركة دون إعلان واجهة صريح؟

تم النشر بتاريخ 2024-12-23
تصفح:745

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

طرق الاتصال على قيود الاتحاد في Go Generics

في Go Generics (الإصدار 1.18)، يمكنك مواجهة قيد اتحاد النوع الذي يحد نوع المعلمة للأنواع التي تطبق واجهة موحدة. ومع ذلك، فإن عدم القدرة على استدعاء الأساليب المشتركة بين الأنواع المقيدة يثير مخاوف بشأن فائدة هذه القيود.

خذ بعين الاعتبار الكود التالي:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

خطأ المترجم "x.some غير محدد" يرجع إلى حقيقة أن قيد اتحاد النوع *A | *B لا يضمن وجود بعض الأساليب على كل من *A و *B.

لحل هذه المشكلة، يمكنك إضافة الأسلوب إلى قيد الواجهة:

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

هذا يقيد T على الأنواع التي تنفذ كلاً من *A أو *B وتعلن عن الطريقة some.

ومع ذلك، يُنظر إلى هذا الحل كحل بديل لما يجب أن يعمل بشكل مثالي مع اتحادات الكتابة وحدها. يحتوي Go 1.18 حاليًا على قيود حيث يدعم المترجم استدعاء طريقة على قيمة معلمة النوع P فقط إذا تم الإعلان عن الطريقة m بشكل صريح بواسطة واجهة القيد P. على الرغم من أن مواصفات اللغة تنص على أن مجموعة الأساليب الخاصة بالواجهة هي تقاطع مجموعات الأساليب لكل نوع في مجموعة أنواع الواجهة. ومن المتوقع أن تتم معالجة هذه المشكلة في Go 1.19.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3