واجهات سهلة مع Zig 0.10.0
يقدم هذا الإصدار من Zig ميزة لغة جديدة تجعل إنشاء أنواع واجهة أكثر سهولة في الاستخدام. p> حول واجهات
لا يحتوي Zig على نوع واجهة مضمن ، على عكس لغات المستوى الأعلى. أحد أسباب هذا الاختيار هو حقيقة أن الأشخاص الذين يستخدمون الواجهات في معظم الأوقات يهتمون بنمذجة البرنامج بالطريقة التي يحبونها ، لكنهم عادةً لا يهتمون كثيرًا بكيفية عمل النظام خلف الكواليس. p >
في Zig ، نهتم دائمًا بما تقوم به الآلة ، وعندما يتعلق الأمر بالواجهات ، هناك العديد من الأساليب ذات المقايضات المختلفة ، كل منها صالح بالتساوي مع حالات الاستخدام المفضلة الخاصة به. p> واجهات على أساس النقابات الموسومة
تتمثل أسهل طريقة لإنشاء نوع واجهة في إنشاء اتحاد مسمى لعمليات التنفيذ الملموسة المحتملة فيه. إنه ليس الخيار الصحيح في جميع الحالات ، ولكنه عادةً ما يكون جيدًا بما يكفي للبرامج البسيطة. p>
لنفترض أن لدينا قطة وكلبًا ونريد أن نتمكن من استخدامهما من خلال واجهة مشتركة. p> قطة كونست = هيكل { pub fn talk () فارغة { std.debug.print ("مواء!"،. {}) ؛ } } ؛ كونست الكلب = هيكل { pub fn talk () فارغة { std.debug.print ("bark!"،. {}) ؛ } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة
من قبل ، كان عليك القيام بذلك في Zig:
const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { .cat => | قطة | chat.talk () ، .dog => | كلب | dog.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشةكما ترى ، فإن النقطة التي يتصل فيها الإرسال الثابت بالإرسال الديناميكي يتم تمييزها صراحةً في تنفيذ Animal.talk. في هذه الوظيفة (التي يمكن إرسالها بشكل ثابت عند استدعائها في مثيل Animal) ، يمكنك أن ترى كيف أن تنشيط الحالة النشطة يستدعي التنفيذ الصحيح ، اعتمادًا على قيمة العلامة (المعروفة عند التنفيذ ، وبالتالي ديناميكية). p >
هذا رائع ، لكن له جانب سلبي يتمثل في الإسهاب قليلاً. تخيل واجهة بها 100 نوع ملموس و 10 طرق كجزء من الواجهة. هذا كثير من التكرار! p>
لحسن الحظ ، بدءًا من Zig 0.10.0 ، يمكنك القيام بذلك: p> const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { مضمنة أخرى => | حالة | case.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة
ما يحدث هنا هو أن سلوك آخر مضمن داخل مفتاح تبديل يتصرف كما هو مضمن لـ أو مضمن أثناء. p>
في الحلقة المضمنة ، يتم فك الحلقة نفسها في الوقت المناسب واستبدالها بالنتيجة ، على النحو التالي: p> أرقام const = [_] usize {1، 2، 3} ؛ تراكم var: usize = 0 ؛ على الإنترنت لـ (أرقام) | n | { ...
يقدم هذا الإصدار من Zig ميزة لغة جديدة تجعل إنشاء أنواع واجهة أكثر سهولة في الاستخدام. p> حول واجهات
لا يحتوي Zig على نوع واجهة مضمن ، على عكس لغات المستوى الأعلى. أحد أسباب هذا الاختيار هو حقيقة أن الأشخاص الذين يستخدمون الواجهات في معظم الأوقات يهتمون بنمذجة البرنامج بالطريقة التي يحبونها ، لكنهم عادةً لا يهتمون كثيرًا بكيفية عمل النظام خلف الكواليس. p >
في Zig ، نهتم دائمًا بما تقوم به الآلة ، وعندما يتعلق الأمر بالواجهات ، هناك العديد من الأساليب ذات المقايضات المختلفة ، كل منها صالح بالتساوي مع حالات الاستخدام المفضلة الخاصة به. p> واجهات على أساس النقابات الموسومة
تتمثل أسهل طريقة لإنشاء نوع واجهة في إنشاء اتحاد مسمى لعمليات التنفيذ الملموسة المحتملة فيه. إنه ليس الخيار الصحيح في جميع الحالات ، ولكنه عادةً ما يكون جيدًا بما يكفي للبرامج البسيطة. p>
لنفترض أن لدينا قطة وكلبًا ونريد أن نتمكن من استخدامهما من خلال واجهة مشتركة. p> قطة كونست = هيكل { pub fn talk () فارغة { std.debug.print ("مواء!"،. {}) ؛ } } ؛ كونست الكلب = هيكل { pub fn talk () فارغة { std.debug.print ("bark!"،. {}) ؛ } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة
من قبل ، كان عليك القيام بذلك في Zig:
const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { .cat => | قطة | chat.talk () ، .dog => | كلب | dog.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشةكما ترى ، فإن النقطة التي يتصل فيها الإرسال الثابت بالإرسال الديناميكي يتم تمييزها صراحةً في تنفيذ Animal.talk. في هذه الوظيفة (التي يمكن إرسالها بشكل ثابت عند استدعائها في مثيل Animal) ، يمكنك أن ترى كيف أن تنشيط الحالة النشطة يستدعي التنفيذ الصحيح ، اعتمادًا على قيمة العلامة (المعروفة عند التنفيذ ، وبالتالي ديناميكية). p >
هذا رائع ، لكن له جانب سلبي يتمثل في الإسهاب قليلاً. تخيل واجهة بها 100 نوع ملموس و 10 طرق كجزء من الواجهة. هذا كثير من التكرار! p>
لحسن الحظ ، بدءًا من Zig 0.10.0 ، يمكنك القيام بذلك: p> const Pet = union (enum) { قط قط، الكلب كلب، pub fn talk (self: Animal) باطل { لتغيير (من نفسه) { مضمنة أخرى => | حالة | case.talk () ، } } } ؛ الدخول إلى وضع ملء الشاشة الخروج من وضع ملء الشاشة
ما يحدث هنا هو أن سلوك آخر مضمن داخل مفتاح تبديل يتصرف كما هو مضمن لـ أو مضمن أثناء. p>
في الحلقة المضمنة ، يتم فك الحلقة نفسها في الوقت المناسب واستبدالها بالنتيجة ، على النحو التالي: p> أرقام const = [_] usize {1، 2، 3} ؛ تراكم var: usize = 0 ؛ على الإنترنت لـ (أرقام) | n | { ...
What's Your Reaction?
![like](https://vidianews.com/assets/img/reactions/like.png)
![dislike](https://vidianews.com/assets/img/reactions/dislike.png)
![love](https://vidianews.com/assets/img/reactions/love.png)
![funny](https://vidianews.com/assets/img/reactions/funny.png)
![angry](https://vidianews.com/assets/img/reactions/angry.png)
![sad](https://vidianews.com/assets/img/reactions/sad.png)
![wow](https://vidianews.com/assets/img/reactions/wow.png)